現在のプログラムは clang によって拒否されましたが、gcc では正常にコンパイルされます。要約すると、次の単純化された例になります。
struct A {
static constexpr inline int one();
};
inline constexpr int A::one() { return 1; }
int main() {
return 0;
}
g++ 4.7.2 はエラーなしでコンパイルします ( g++ -std=c++11 -Wall -g -o main example.cpp
)。clang++ 3.1 はそれを拒否します:
$ clang++ -std=c++11 -Wall -g -o main example.cpp
example.cpp:6:25: error: conflicting types for 'one'
inline constexpr int A::one() { return 1; }
^
example.cpp:3:31: note: previous declaration is here
static constexpr inline int one();
^
1 error generated.
私の賭けは、gcc が正しく、clang が間違っているということですか? プログラムは正当な C++11 である必要があります。
興味深い補足。が構造体内に実装されている場合one
、clang はもう文句を言いません:
struct A {
static constexpr inline int one() { return 1; }
}
gcc もこのバリアントを受け入れます。私の理解では、両方のバージョンは標準に従って同一である必要があります。それはclangのバグですか、それとも何か不足していますか?