c – 为什么非const引用参数可以绑定到临时对象?
作者:互联网
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???
}
error C2664: ‘void f4(char &)’ : cannot convert argument 1 from ‘char’
to ‘char &’
我被教导过,在C中,非const引用参数不能绑定到临时对象;在上面的代码中,f2(f1());按预期触发错误.
但是,为什么同样的规则不适用于代码行f4(f3());?
PS:我的编译器是VC 2013.即使我注释了行f2(f1());,那么代码包含f4(f3());将编译没有任何错误或警告.
更新:
MSDN说:
In previous releases of Visual C++, non-const references could be
bound to temporary objects. Now, temporary objects can only be bound
to const references.
所以我认为这是VC的一个bug.我已向VC++ team提交了错误报告
解决方法:
如果使用the /Za option编译来禁用语言扩展,则编译器会拒绝两个调用:
> cl /Za test.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
test.cpp(11): error C2664: 'void f2(char &)' : cannot convert argument 1 from 'char' to 'char &'
test.cpp(12): error C2664: 'void f4(A &)' : cannot convert argument 1 from 'A' to 'A &'
A non-const reference may only be bound to an lvalue
有几种(非常有约束的)情况,其中启用了语言扩展的编译器仍然允许非const左值引用绑定到rvalue表达式.我的理解是,这主要是为了避免破坏依赖于这种“扩展”的几个巨大遗留代码库.
(一般情况下,建议不要使用/ Za,原因很多,但主要是因为Windows SDK标头不能与/ Za选项一起使用.)
标签:object-lifetime,temporary-objects,c,const,reference 来源: https://codeday.me/bug/20190825/1718697.html