簡體   English   中英

C ++和C ++ 11類靜態成員,double應該使用“constexpr”,而int可以是“const”,為什么?

[英]C++ and C++11 class static member, double should use “constexpr” while int can be “const”, why?

結構C定義了幾個靜態const成員,如下所示:

代碼如下:

#include<stdio.h>
struct C{
    static int i;
    static const int j=1;
    static constexpr double d=1;
    static const double d1=1.0;
};
int main(){
    return 0;
}

編譯會導致錯誤:

$g++ testStatic.cpp -std=c++11
testStatic.cpp:6:25: error: in-class initializer for static data member of
      type 'const double' requires 'constexpr' specifier
      [-Wstatic-float-init]
    static const double d1=1.0;
                        ^  ~~~
testStatic.cpp:6:5: note: add 'constexpr'
    static const double d1=1.0;
    ^
    constexpr
1 error generated.

為什么這么奇怪為什么static int可以是const,double應該是constexpr,什么是理性的

const遵循C ++ 98和C ++ 03中定義的原始語言規范。 通常不允許在C ++ 98中為static const成員提供類內的initalizer。 在C ++ 98中對整數和枚舉類型的static const對象執行此操作的可能性是對這些類型的特殊處理的一部分。

constexpr是C ++ 11中引入的新功能。 它的設計不同,適用於所有類型。

因此,您可以將constexpr用於整數和浮點類型,並忘記任何非均勻性。

如果在這種情況下繼續使用const ,則必須處理C ++ 98遺留問題。 但是,C ++ 17將引入內聯變量 ,這也應該可以為任何類型的inline static const對象使用類內初始化器。

暫無
暫無

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

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