2014-02-08 61 views
2

這是來自C++ 11。C++標準第12.1.14段的基本原理是什麼?

在一個const對象的構造,如果對象或任何其子對象的的值被經由未獲得,直接或間接地從構造的這個指針glvalue,的值 訪問 這樣獲得的對象或子對象是未指定的。 [例:

struct C; 
void no_opt(C*); 

struct C { 
    int c; 
    C() : c(0) { no_opt(this); } 
}; 

const C cobj; 

void no_opt(C* cptr) { 
    int i = cobj.c * 100;   // value of cobj.c is unspecified 
    cptr->c = 1; 
    cout << cobj.c * 100   // value of cobj.c is unspecified 
    << ’\n’; 
} 

- 年底例如]

爲什麼它僅適用於const對象?

+0

猜測:因爲這消除了對象必須存在的要求。換句話說,通過這種方式,編譯器可以自由地優化內聯'const'對象,而不是實際佔用內存。你不能這樣做,也有一個有效的'this'。 – Adam

+0

還有另外一個優化可以在這裏發揮作用:對const對象的(非可變)成員的多次訪問總是產生相同的值,所以你只需要閱讀一次[live example](http://coliru.stacked-crooked的.com /一個/ 7728bbb912ddba1a)。這至少解釋了爲什麼第二次訪問cobj.c會產生一個未指定的值。 – dyp

回答

1

要真正理解您需要與委員會委員通信的理​​由,或者至少閱讀相關討論。我無法幫助你。

在上下文中服務的目的是對const對象的構造施加比普遍適用更嚴格的限制。通常適用的規則在S12.7中已經有了一定的篇幅,廣泛地講它們關注對象的生命週期。例如,他們不禁止別名。

對const對象的限制將允許實現者採用更積極的優化策略。例如,一個對象可能在翻譯時構建,或者只通過將其從一個循環中提出或完全優化而構造一次。由於const對象不會改變,編譯器通常不必擔心別名,但是(如示例代碼所示)在這種特殊情況下他們會。

我不禁想到必須有這樣一個情況,這個規則可以防止一些其他外部可見的違反const要求。給出的例子不是這種情況,我一直沒有找到。也許一些其他貢獻者可以提供幫助。

相關問題