2017-01-25 18 views
4

在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

+4

這是C++ 11缺陷報告,那麼C++ 11需要修復。 C++ 11符合的編譯器必須包含那個DR – Danh

+1

@danh這是既完整又足夠長的答案。請將它移到下面的框中。謝謝您的合作。 ;) – Yakk

回答