其他分享
首页 > 其他分享> > c – 为什么非const引用参数可以绑定到临时对象?

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