は、以下のコードを検討べきではない:これは、関数呼び出しの周りに薄いラッパーであるデフォルト関数パラメータ値が、(GCC)
#include <utility>
void f(int, int);
void g(int, int);
struct functor
{
template<typename... T>
void operator()(T&&... params)
{
return f(std::forward<T>(params)...);
}
};
int main()
{
functor()(1); // can use the default value here, why?!
// g(1); // error here as expected, too few arguments
}
void f(int a, int b = 42) {}
void g(int a, int b = 24) {}
を。しかし、functor::operator()
の内部では、f
は、既知の第2パラメータ(デフォルトではmain
の後にしか表示されません)のデフォルト値を持たないため、コードをコンパイルするべきではありません。 G ++ 5.2はかかわらず、正常にコンパイルしますが、打ち鳴らすが、++ 1が正しく二相名の検索を行うコンパイラのために期待する期待のメッセージを出してくれる:
error: call to function 'f' that is neither visible in the template definition nor found by argument-dependent lookup return f(std::forward(params)...);
これはgccのバグですか、私はここで何かが足りないのですか?つまり、f
の定義の後のインスタンス化のポイントはmain()
ですか?しかし、この場合でさえ、それは機能しません。第2段階では、関数はADLを介してのみ見つけることができますが、ここではそうではありません。
翻訳終了単位も、インスタンス化の有効なポイントです。 – Jarod42
はい、それでも動作しません。なぜなら、第2段階ではADLだけが実行されるからです。 – vsoftco
ファイルの終わりにインスタンス化すると、デフォルトパラメータを持つ 'f'の定義が見えます...プログラムが不正な形式でないかどうかわかりません... – Jarod42