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&
和添加const
到int&
使得int& const
這是const引用到int
'const'應用於引用(而忽略),而不是所引用的類型。 –
將'decltype'與修飾符結合起來就像將修飾符應用於'typedef'-ed類型一樣。這不是文字替換。 –
@ T.C。 @ ben-voigt哦,我明白了。所以'const'被應用到'int&'的整個體來作爲'const引用到int',而不僅僅是被合併爲'const int&',引用const int ...對嗎? – CyberLuc