2015-06-16 84 views
6

今天我看到一些像這樣的代碼:'const decltype((a))'沒有聲明一個const引用?

int a = 0; 
const decltype((a)) x = 10; // Error 

const int b = 0; 
decltype ((b)) y = 42; // Correct 

我可以看到爲什麼正確的代碼是正確的,但我不明白爲什麼不正確的代碼不正確。

我測試了一下,發現它有點奇怪。

const decltype((a)) x = 10;這應該是定義一個const int&對不對?但它不會編譯! error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'。我改成const decltype((a)) x = a;然後編譯。那麼,x一個const引用?不,我發現它是一個非const引用。我可以通過x修改a的值。

爲什麼const修飾符沒有生效?因爲const被施加到完整的類型是int&和添加constint&使得int& const這是const引用到int

+4

'const'應用於引用(而忽略),而不是所引用的類型。 –

+3

將'decltype'與修飾符結合起來就像將修飾符應用於'typedef'-ed類型一樣。這不是文字替換。 –

+0

@ T.C。 @ ben-voigt哦,我明白了。所以'const'被應用到'int&'的整個體來作爲'const引用到int',而不僅僅是被合併爲'const int&',引用const int ...對嗎? – CyberLuc

回答

8

不正確的部分不正確。但是它的本質是const,所以const部分被忽略。因此得到的類型仍然是int&

相關問題