私は Visual Studio Express 2013 を使用しており、C++ でさまざまなことを学ぼうとして少し浮気しています。
コンパイラで、参照と同じ型に明示的に型キャストしたときに一時オブジェクトが作成されないように見える興味深いバグを見つけました。
#include <iostream>
using namespace std;
int main()
{
int number; // float number;
number = 2;
const int& plainref_i = number;
const int& recastref_i = (int)number; // this goes wrong if number is int
const float& plainref_f = number;
const float& recastref_f = (float)number; // this goes wrong if number is float
number = 3;
std::cout << plainref_i << "\n";
std::cout << recastref_i << "\n";
std::cout << plainref_f << "\n";
std::cout << recastref_f << "\n";
return 0;
}
これを VS でコンパイルすると、次の出力が得られます: 3 3 2 2
ただし、gcc でコンパイルすると、次の出力が得られます: 3 2 2 2
「int number;」を置き換えると 「浮動小数点数;」VSに入る: 2 2 3 3
そしてgccの場合:2 2 3 2
誰かがこれをバグとして確認できるかどうか、また実行可能な回避策/解決策を誰かが知っているかどうか疑問に思っています。