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++ 中,非常量引用参数不能绑定到临时对象;在上面的代码中,f2(f1());
按预期触发错误。
但是,为什么相同的规则不适用于代码行f4(f3());
?
PS:我的编译器是VC++ 2013。即使我注释了这一行f2(f1());
,包含的代码f4(f3());
也会被编译,没有任何错误或警告。
更新:
MSDN说:
在以前的 Visual C++ 版本中,非常量引用可以绑定到临时对象。现在,临时对象只能绑定到 const 引用。
所以我认为这是VC++的一个错误。我已向VC++ 团队提交了错误报告