我一直读到,在函数调用的情况下,临时变量只能与非常量引用参数绑定。
CASE 1:-
例如:-
class Simple{
public:
int i;
Simple(Simple &f)
{
i = f.i + 1;
}
Simple(int j)
{
i = j;
}
};
int main()
{
Simple f1 = Simple(2); // error no matching call fruit::fruit(fruit)...
return 0;
}
当我尝试将临时值与非常量引用参数绑定时,这会给我带来错误。
CASE 2:-
try
{
throw e;
}
catch ( exception& e )
{
}
我了解到,当我们抛出异常时,真正传递给 catch 的是抛出的原始异常的副本,即为抛出的对象创建一个临时对象,然后将其传递给 catch 子句。
catch 所做的就是通过非常量引用捕获此异常。这与我在案例 1 中所展示的相反。
所以,我的问题是:-
1)是否存在允许将临时引用绑定到非常量引用的特定场景。
2) 如果存在,那么在允许这些例外情况时要考虑哪些因素。
是否存在允许将临时引用绑定到非常量引用的特定场景。
对于左值引用(即类型T&
)没有。您不能将临时值绑定到非常量左值引用,因为修改诸如以下的文字没有多大意义42
。他们可以绑定到const左值引用,因为那时已经做出了承诺not修改引用所绑定的对象。
他们实际上可以绑定到rvalue-参考 (T&&
),但这与此线程无关。
如果存在,那么在允许这些例外的同时会考虑哪些因素。
确实,临时对象不能绑定到非常量左值引用,但是对于异常对象有一定的规定:
取自 C++11 标准(最接近的草案n3337):
§15.1/3A抛出表达式初始化一个临时对象,称为异常对象,其类型是通过从 throw 操作数的静态类型中删除任何顶级 cv 限定符来确定的
并将类型从“T 数组”或“返回 T 的函数”调整为
分别是“指向 T 的指针”或“指向返回 T 的函数的指针”。这
临时是一个左值,用于初始化名为的变量
匹配的handler(15.3)。[..]
emphasis mine
参考参数将其简化为:
与其他临时对象不同,异常对象在初始化catch子句参数时被认为是左值参数,因此可以通过左值引用捕获、修改和重新抛出。
因此,对于这种情况,您实际上可以将异常绑定到非常量左值引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)