char f1();
void f2(char&);
struct A {};
A f3();
void f4(A&);
int main()
{
f2(f1()); // error C2664. This is as expected.
f4(f3()); // OK! Why???
}
エラー C2664: 'void f4(char &)': 引数 1 を 'char' から 'char &' に変換できません
私は、C++ では非 const 参照パラメーターを一時オブジェクトにバインドできないと教えられました。上記のコードでは、f2(f1());
期待どおりにエラーが発生します。
しかし、なぜ同じルールがコード行に適用されないのf4(f3());
でしょうか?
PS: 私のコンパイラは VC++ 2013 です。行にコメントを付けても、f2(f1());
含まれているコードはf4(f3());
エラーや警告なしでコンパイルされます。
アップデート:
MSDNは次のように述べています。
Visual C++ の以前のリリースでは、非 const 参照を一時オブジェクトにバインドできました。現在、一時オブジェクトは const 参照にのみバインドできます。
なのでVC++のバグだと思います。バグレポートをVC++ チームに提出しました