2014-03-31 89 views
5

根據C++ 1998標準第3.5節的第3節,const引用具有內部鏈接。const引用在C++中有外部鏈接嗎?

的名稱具有命名空間範圍(3.3.5)具有內部連接,如果它是

  • 的對象,參考,功能或功能模板被顯式聲明靜態的名稱或,

  • 一個明確聲明爲const的對象或引用,既沒有明確聲明爲extern也沒有聲明過具有外部鏈接;或

  • 匿名聯盟的數據成員。

但爲什麼多重定義衝突編譯下面的代碼時產生?

// a.cpp 
const int& a = 1; 

int main() 
{ 
    return 0; 
} 

// b.cpp 
const int& a = 1; 

然後編譯代碼。

$ g++ a.cpp b.cpp 
/tmp/ccb5Qi0M.o:(.bss+0x0): multiple definition of `a' 
/tmp/ccD9vrzP.o:(.bss+0x0): first defined here 
collect2: error: ld returned 1 exit status 

如果const引用被更改爲const,如下

// a.cpp 
const int a = 1; 

int main() 
{ 
    return 0; 
} 

// b.cpp 
const int a = 1; 

它是確定編譯。

回答

2

參考本身不是const,只是它引用的對象;所以(可以說)這個規則並沒有給參考內部聯繫。

這是沒有意義的參考被宣佈爲const。在C++ 11標準明確了措詞:

被顯式聲明constconstexpr既不明確聲明extern也不先前聲明的變量到具有外部連接

沒有提到的無意義的概念的的參考文獻宣稱爲const

+0

你的意思是C++ 1998標準中的措詞有誤導性嗎? – spockwang

+0

@spockwang:我不知道「誤導」,但它確實令人困惑,現在已被澄清。 –

+0

有沒有人有一個很好的例子來使用這樣的引用,並希望它不是默認的文件範圍? – Deduplicator

0

我認爲@Mike是正確的,這裏沒有新東西,只是一點小費。

有引用和引用的對象,對象可以是常量,然後來內部鏈接,但引用本身永遠不會是恆定的,因爲它沒有CV概念(引用在聲明期間初始化,然後永遠不會轉移到一些對象別的,我記得GCC抱怨,如果你給一個常量引用,意思是int const & r = o;雖然VS沒有抱怨,只是沒有意義),因爲引用既不是常量也不是靜態的,文件。