次のコードを検討してください。
struct X {
static const int i = 45;
};
void foo() {
const int* k = &X::i;
}
int main() {
}
お気に入りのコンパイラを開かずに、この単純な獣をコンパイルしてリンクしようとすると、どのような結果になると思いますか?
コンパイラだけでなく、その最適化オプションにも依存することに驚く人もいるかもしれません! たとえば、gcc では、コードは最適化をオフにするとリンクを拒否しますが、最適化をオンにすると喜んでリンクします (そして runnable-doing-nothing 実行可能ファイルを生成します)。
失敗した場合の診断はおかしいでしょう - シンボルX::i
が見つからないでしょう。破棄されるため、最適化が有効なリンクは成功X::i
します。
そして質問。このコードをコンパイルするコンパイラの動作は正しいですか? X::i
にはリンケージがないので、このシンボルでリンケージを要求するコードを生成するように要求されたときに、コンパイラーは文句を言うべきではありませんか?