次のコードを検討してください。
#include <iostream>
void f(int&& i)
{
std::cout << "f(int&&)\n";
}
void f(const int&& i)
{
std::cout << "f(const int&&)\n";
}
int fun_i()
{
return 0;
}
const int fun_ci()
{
return 0;
}
int main()
{
f(fun_i());
f(fun_ci());
}
これを MSVC 2012 でコンパイルすると、出力は次のようになります。
f(int&&)
f(const int&&)
GCC 4.7 でコンパイルすると、出力は次のようになります。
f(int&&)
f(int&&)
どちらが正しい?
(f の 2 番目の定義を削除すると、プログラムは MSVC 2012 ではコンパイルされませんが、GCC 4.7 ではコンパイルされます。)