今天早上我正在處理一些模板代碼,我使用了BOOST_STATIC_ASSERT
來確保我沒有創建對錯誤類型的引用,因爲我認爲這可能是一個更清晰的錯誤消息。然而,當我試圖消除靜態斷言來看看我很震驚地發現,GCC甚至沒有抱怨當您嘗試做一個const雙&指爲int的替代編譯器錯誤:C++如何處理const double&引用int?
#include <iostream>
int main()
{
int x = 5;
const double& y = x;
std::cout << y << std::endl;
return 0;
}
編譯,甚至沒有警告:
$ g++ ~/stuff/badRef.cpp -Wall -Wextra -pedantic
$ a.out
5
這是怎麼回事?這是不確定的行爲?如果是的話爲什麼不gcc抱怨?在我的機器上,int是4個字節,double是8.這意味着當打印一個雙精度值時,它應該將該地址處的8個字節解釋爲double並打印出來,但實際上在那個位置上有一個4字節的int。
非常困惑。幫幫我!
哪個版本的GCC? – 2012-02-02 23:13:54
它是版本4.3.3。 – voltrevo 2012-02-02 23:32:50
當你在'const double&y = x;'之後添加'x = 42;'時會發生什麼?一見鍾情可能會好奇/出乎意料。 – moala 2012-02-03 10:10:09