ここで、関数のアドレスを取得すると、特に Substitution-Failure-Is-Not-An-Error に関して、その関数のコンパイルが強制されるかどうかについて質問しました。これに対する最も直接的な答えはここにあります:
非形式的には、オブジェクトは、そのアドレスが取得されるか参照がバインドされている場合に ODR 使用され、関数は、関数呼び出しが行われるかアドレスが取得される場合に ODR 使用されます。オブジェクトまたは関数が ODR で使用される場合、その定義はプログラムのどこかに存在する必要があります。これに違反すると、リンク時エラーになります。
しかし、私がテストしたすべてのコンパイラは、これが完全に実行可能であることを示しています。
void foo(int);
auto bar = &foo;
これは合法ではないですよね?しかし、そうでない場合、なぜそれは構築されているのでしょうか?