簡體   English   中英

混合constexpr聲明和const定義

[英]Mixing constexpr declarations and const definitions

我遇到了以下情況:

struct Foo
{
    static constexpr char s[] = "Hello world";
};

const char Foo::s[];

這段代碼片段用Clang 3.7編譯( -std=c++11-std=c++14 ),但是GCC(4.8,6.0,相同的語言設置)給出了我預期的錯誤:

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 ,但它關注的是初始化器是否是常量表達式,而不是定義和聲明是否可以在const方面有所不同。

是否允許將constexpr T靜態數據成員的定義作為const T

您的代碼格式正確。 constexpr -specifier本身不是該類型的一部分,但添加了const ([dcl.constexpr] / 9),它存在於您的第二個聲明中。 雖然根據[dcl.constexpr] / 1,一個函數(或函數模板)的不同聲明必須在constexpr -ness中達成一致,但變量聲明不存在這樣的規則。

請參閱錯誤#58541 ,它基本上使用了您的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM