簡體   English   中英

來自另一個非靜態的非靜態成員初始化程序

[英]Non-static member initializer from another non-static

很簡單的問題。 這是有效的C ++ 11嗎?

struct Foo {
    int bar = 1;
    int baz = bar;
};

GCC(4.7.2)和Clang(3.1)都接受了迂腐的設置:

-std=c++11 -Wall -W -pedantic

英特爾C ++(13.0.1.117)沒有。 它咆哮在int baz = bar; 有:

error: a nonstatic member reference must be relative to a specific object

誰是對的?

如果您想知道,我將此用於此類代碼,它將初始化代碼放在一起,而不是將最后一行移動到構造函數中:

uint8_t colorR = -1;
uint8_t colorG = -1;
uint8_t colorB = -1;
uint8_t colorA = -1;
GLubyte RGBAVec[4] = {colorR, colorG, colorB, colorA};

5.1p12只能使用表示非靜態數據成員或類的非靜態成員函數的id表達式

  • 作為類成員訪問(5.2.5)的一部分,其中對象表達式引用成員的類或從該類派生的類,或者
  • 形成指向成員(5.3.1)的指針,或
  • mem-initializer中 ,用於該類的構造函數或從該類派生的類(12.6.2),或者
  • 用於該類的非靜態數據成員或從該類派生的類(12.6.2) 大括號或等於初始化程序 ,或者
  • 如果該id-expression表示非靜態數據成員,則它出現在未評估的操作數中。

所以是的,這個:

struct Foo {
  int bar = 1;
  int baz = bar;
};

是有效的C ++ 11。

但要小心訂單,因為:

12.6.2p10在非委托構造函數中,初始化按以下順序進行:

  • 首先,僅對於派生程度最高的類(1.8)的構造函數,虛擬基類按照它們出現在基類的有向無環圖的深度優先從左到右遍歷的順序進行初始化,其中“左 - to-right“是派生類base-specifier-list中基類出現的順序。
  • 然后,直接基類按聲明順序初始化,因為它們出現在base-specifier-list中(無論mem-initializers的順序如何)。
  • 然后, 非靜態數據成員按照它們在類定義中聲明的順序進行初始化 (同樣不管mem-initializers的順序如何)。
  • 最后,執行構造函數體的復合語句

因此,在非靜態數據成員初始化程序提議 (問題3)中指定:

第三個問題是類范圍查找可能會將編譯時錯誤轉換為運行時錯誤:

 struct S { int i = j; // ill-formed without forward lookup, undefined behavior with int j = 3; }; 

(除非被編譯器捕獲,否則我可能會使用未定義的j值進行初始化。)

暫無
暫無

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

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