2014-05-06 20 views
6

句子是§3.2/ 2段的一部分:這句話在C++ 11標準的§3.2/ 2中是什麼意思?

一個變量,其名稱顯示爲潛在評估表達是 ODR使用的,除非它是滿足出現在用於 要求的對象常數表達式(5.19)和左值到右值 轉換(4.1)立即應用

粗體的句子究竟是什麼意思?

編輯

這個問題的答案,其中這個被認爲是重複的問題,並沒有說什麼,能回答我的問題。

回答

7

這意味着當你使用常量作爲常量時,就像你實際使用常量一樣。

struct S { 
    static const int i = 0; 
}; 
int main() { 
    return S::i; 
} 

雖然S::i有一個初始化器,它沒有定義,但在你討論的文字使得對於這樣的用途,其中S::i只爲它的價值訪問一個特殊的例外。在這種情況下,不需要定義。

在另一方面,其他用途確實需要一個定義:

struct S { 
    static const int i = 0; 
}; 
int f(const int &i) { 
    return i; 
} 
int main() { 
    return f(S::i); 
} 

這個程序是無效的,由一些實現接受,但被別人拒絕。對f的調用需要存在S::i的實際定義,但如果f被內聯,則可能缺少未定義的定義。

在我的系統,如果編譯和無的優化連接的第二方案,我得到:

 
$ g++ test2.cc -o test2 
/tmp/ccdEsfxs.o:test2.cc:function main: error: undefined reference to 'S::i' 
collect2: error: ld returned 1 exit status 

要讓它工作,定義需要提供,像這樣:

struct S { 
    static const int i = 0; 
}; 
const int S::i; 
+0

如何你會將第一個例子中的「左值到右值轉換是否立即應用」這個短語與你的第一個例子聯繫起來嗎? –

+1

你是什麼意思「它沒有定義」? – 0x499602D2

+0

@WakeupBrazil'S :: i'是一個左值,它用在返回'int'的函數的'return'語句中。在這種情況下,左值需要被(並且被)轉換爲右值。 (這不是事實上它本身被用在'return'語句中:在返回'int&'的函數中,不會應用左值到右值的轉換。) – hvd