在C++ 14標準(ISO/IEC 14882:2014)詞語 「非可變」 章節5.19中的溶液,第2段(重點煤礦) :可變的會員在一個ConstExpr對象C++ 11
甲條件表達式 e是一個芯常量表達式除非e的評價,如下所述的抽象機(1.9),將評估下面的表達式中的一個的規則:
- [...]
- 左值到右值,除非它被施加到
- [...]
- 非易失性glvalue其指的是與constexpr定義的非揮發性物體,或轉化(4.1)是指這樣的物體的非可變子對象,或
因此,該代碼是不正確的在C++ 14:
class A {
public:
mutable int x;
};
int main(){
constexpr A a = {1};
constexpr int y = a.x;
return 0;
}
但是,它在C++ 11中是否正確?
這是缺陷報告(CD)1405,他們建議增加不可變:
目前,字面類類型可以有可變成員。目前尚不清楚這是否會帶來constexpr對象和常量表達式的特定問題,如果是這樣,應該怎麼做。
所以我會說這是正確的C++ 11代碼。不過,我用-std = C++ 11嘗試了Clang和GCC,並且都輸出了一個錯誤,表示不允許在常量表達式中使用可變變量。但是這個約束是在C++ 14中添加的,它不在C++ 11中。
有誰知道C++ 11中的代碼是否正確?
參見缺陷報告(CD3)1428。
這是C++ 11缺陷報告,那麼C++ 11需要修復。 C++ 11符合的編譯器必須包含那個DR – Danh
@danh這是既完整又足夠長的答案。請將它移到下面的框中。謝謝您的合作。 ;) – Yakk