当前位置:  开发笔记 > 编程语言 > 正文

什么时候不能将对象转换为引用?

如何解决《什么时候不能将对象转换为引用?》经验,为你挑选了1个好方法。

我想从http://code.google.com/p/enhsim编译以下代码行:

enh::eout << enh::setw(26);

gcc给出以下错误:

error: no match for 'operator<<' in 'enh::eout << enh::setw(26)'

但是这个EnhSimOutput类(其中enh::eout是一个实例)确实声明:

EnhSimOutput& operator<< (setw& p);

如果我实现一个按值接受对象的操作版本,这个问题就消失了:

EnhSimOutput& operator<< (setw p);

或者如果我将enh::setw对象创建为本地对象,即:

enh::setw wValue(26);
enh::eout << wValue;

我的问题是:为什么gcc不选择运营商的"按引用"版本开头?

编写此代码的开发人员明确地将其编译,但默认gcc拒绝执行此操作.为什么单独声明为局部变量的对象与本地创建的内联之间存在差异?



1> Johannes Sch..:

该值enh::setw(26);右值.实际上,像这样的临时工具是价值.Rvalues有特殊属性.其中之一就是它们的地址不能被采用(&enh::setw(26);是非法的),并且它们通常不能绑定到非const的引用(某些临时数据可以绑定到非const的引用,但是它们经历了特殊的规则:调用成员临时对象上的函数和通过引用非常量来捕获异常对象.在后一种情况下,临时偶数是一个左值.

有两种表达式:lvalues表示对象(进而可以存储值)或函数,rvalues表示从对象读出的值或由临时值,数字文字和枚举器常量表示的值.在C++ 03中,为了能够将这些值传递给接受其引用值的函数,有一条规则可以通过引用setw const& p接受它们:接受它.也就是说,您必须像这样声明您的运算符:

EnhSimOutput& operator<< (setw const& p);

这有点不幸,因为你无法消除常量左值(你在堆栈中使用const enh::setw e(26);的对象)和非const或const rvalues(比如enh::setw(26);非const临时值)的歧义.此外,如果你这样做,参数不能在其上调用非const成员函数,因为它是一个const的引用.出于这个原因,下一个C++版本的C++ 1x引入了一种新的引用,即所谓的rvalue-references,它修复了这种情况.


微软的Visual C++编译器结合右值对非const引用,但这样做,(你必须至少使用警告级别4它会显示)时,给出了一个警告.这是不幸的,因为当移植到标准合规性更严格的其他编译器时问题会增加.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有