2015-10-10 22 views
18

エラー私が期待しているだろう:ミキシングconstexprの宣言と定数が定義さ

GCC 4.8:

in.cpp:6:19: error: redeclaration ‘Foo::s’ differs in ‘constexpr’ 
const char Foo::s[]; 
       ^
in.cpp:3:27: error: from previous declaration ‘Foo::s’ 
    static constexpr char s[] = "Hello world"; 
         ^
in.cpp:6:19: error: declaration of ‘constexpr const char Foo::s [12]’ outside of class is not definition [-fpermissive] 
const char Foo::s[]; 

GCC 6.0:

‘constexpr’ needed for in-class initialization of static data member ‘const char Foo::s [12]’ of non-integral type [-fpermissive] 

私はconstexprconstを混合話し合うようだthis old questionを見つけたが、それは初期化子ではなく定義と宣言はconst性に関しては異なることができるかどうかに、定数式であるかどうかに焦点を当てて。

constexpr T静的データメンバーの定義をconst Tとして指定することはできますか?

+1

[なぜGCCはconstexpr静的データメンバーの定義にconstexprとマークする必要があると思うのですか?](0120-18753-1708801) –

+0

@ShafikYaghmour:ありがとう、面白い。 GCCエラーメッセージがより混乱しているようです。 4.8では、標準と矛盾していますが、一貫していますが、新しいエラーメッセージはあいまいです。 –

答えて

13

あなたのコードは整形式です。 constexpr -specifier自体は型の一部ではなく、const([dcl.constexpr]/9)が追加されています。これは2番目の宣言にあります。 1つの関数(または関数テンプレート)の異なる宣言はconstexpr --ness [dcl.constexpr]/1に一致する必要がありますが、変数宣言にはそのようなルールは存在しません。

バグ#58541を参照してください。これは基本的にあなたの例を使用しています。

+1

すばらしい発見、ありがとう! –

関連する問題