2
次のコードは特定のコンパイラでコンパイルされていません。C++スコープの解像度と条件を持つ3進演算子
#include <iostream>
using namespace std;
class A{
public:
static const int x = 12;
static const int y = 16;
};
int main(){
int a = 12, b = 19;
int z = (a==b)?(A::x):(A::y);
cout<<z<<endl;
return 0;
}
コンパイラG ++(GCC)4.8.5 20150623(Red Hatの4.8.5-11)は正常にコンパイル。
コンパイラG ++(GCC)4.4.7私は、その後、true
またはfalse
によってラインint z = (a==b)?(A::x):(A::y);
状態(a==b)
を交換する場合は20120313(Red Hatは4.4.7-17)は、コンパイルエラー
test.cpp:(.text+0x20): undefined reference to `A::x'
test.cpp:(.text+0x28): undefined reference to `A::y'
を引き起こしていること正常にコンパイルされます。
指定されたコンパイラで修正する理由とその理由は何ですか?
修正されたコンパイラのバグを見つけたようです。 – dasblinkenlight
後者のコンパイラはおそらくすべてを 'z = 16'に最適化することができます。生成されたマシンコードを見てみましょう。 –
C++でコンパイルしたDd 0x/11がオンになっていますか? [ここ](https://godbolt.org/g/2eyWlM)を再現できません – NathanOliver