我一直都知道,在函数调用的情况下,临时允许只与非const引用参数绑定..
案例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;
}
这会给我带来错误,因为我试图用非const引用参数绑定临时。
案例2: -
try
{
throw e;
}
catch ( exception& e )
{
}
我已经学会了当我们抛出异常时,真正传递给catch的是抛出的原始异常的副本,即为抛出的对象创建临时,然后将其传递给catch子句。
正在做的是通过非const引用捕获此异常。这与我在案例1中所显示的相反。
所以,我的问题是: -
1)是否存在允许将临时绑定到非const引用的特定方案。
2)如果在允许这些例外的情况下考虑了哪些因素。
答案 0 :(得分:2)
是否存在允许将临时绑定到非const引用的特定方案。
对于左值引用(即类型T&
),没有。您不能将临时绑定到非const左值引用,因为修改像42
之类的文字没有多大意义。它们可以绑定到 const lvalue-references,因为已经有一个promise not 来修改绑定引用的对象。
它们实际上可以绑定到rvalue-references(T&&
),但这与此线程无关。
如果在允许这些例外的情况下考虑了哪些因素。
确实临时数不能绑定到非const左值引用,但是对异常对象有一定的规定:
取自C ++ 11标准(最接近的草案n3337):
§15.1/ 3 throw-expression 初始化一个名为的临时对象 异常对象,其类型是通过从throw的操作数的静态类型中删除任何顶级cv限定符来确定的 并将类型从“T数组”或“函数返回T”调整为 “指向T的指针”或“指向函数返回T的指针”。的的 temporary是一个左值,用于初始化名为的变量 匹配的处理程序 (15.3)。 [..]
强调我的
cppreference将其简化为:
与其他临时对象不同,异常对象在初始化catch子句参数时被认为是左值参数,因此可以通过左值引用,修改和重新捕获来捕获它。
因此,对于这种情况,您实际上可以将异常绑定到非const左值引用。