7

関数のコンパイルをトリガーしてはならないこの質問に対する公式の回答を得ました。実際、宣言されているが定義されていない関数は正当です。decltypedecltype

次の質問は、関数のアドレスを取得すると、関数のコンパイルがトリガーされますか? この例を見てください:

template <typename T>
void foo(T&& x) { x.func(); }

int main()
{
    auto bar = &foo<int>;
}

私がテストしたすべてのコンパイラは、次のようなエラーで失敗します。

非クラス タイプの のメンバーfuncの要求xint

しかし、定義するだけfooで宣言しないと、コードは正常にコンパイルされます。関数のアドレスを取得するためにコンパイルが必要かどうかについて、誰かが公式の情報源を提供してくれますか?

4

1 に答える 1

2

3.2/2:

式は、未評価のオペランド (第 5 節) またはその部分式でない限り、評価される可能性があります。... 評価される可能性のある式から参照されたときにオーバーロードの解決によって選択された場合、名前が評価される可能性のある式または候補関数のセットのメンバーとして表示されるオーバーロードされていない関数は、そうでない限り、odr 使用されます。純粋仮想関数であり、その名前は明示的に修飾されていません。

次に 3.2/3:

すべてのプログラムには、そのプログラムで ODR で使用されるすべての非インライン関数または変数の定義が 1 つだけ含まれている必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (12.1、12.4、および 12.8 を参照)。インライン関数は、odr が使用されるすべての翻訳単位で定義されます。

関数名は未評価のオペランド (たとえば to sizeof, decltype) ではなく、かつ式に含まれているため、評価される可能性があります。次に、2 番目の定義では、各翻訳単位に 1 つの非インライン定義、または同一のインライン定義が必要です。

于 2016-07-15T17:53:12.793 に答える