在异常的情况下将临时绑定绑定到非const引用

时间:2014-11-07 17:33:54

标签: c++ temporary-objects

我一直都知道,在函数调用的情况下,临时允许只与非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)如果在允许这些例外的情况下考虑了哪些因素。

1 个答案:

答案 0 :(得分:2)

  

是否存在允许将临时绑定到非const引用的特定方案。

对于左值引用(即类型T&),没有。您不能将临时绑定到非const左值引用,因为修改像42之类的文字没有多大意义。它们可以绑定到 const lvalue-references,因为已经有一个promise not 来修改绑定引用的对象。

它们实际上可以绑定到rvalue-referencesT&&),但这与此线程无关。

  

如果在允许这些例外的情况下考虑了哪些因素。

确实临时数不能绑定到非const左值引用,但是对异常对象有一定的规定:

取自C ++ 11标准(最接近的草案n3337):

  

§15.1/ 3 throw-expression 初始化一个名为的临时对象   异常对象,其类型是通过从throw的操作数的静态类型中删除任何顶级cv限定符来确定的   并将类型从“T数组”或“函数返回T”调整为   “指向T的指针”或“指向函数返回T的指针”。的的   temporary是一个左值,用于初始化名为的变量   匹配的处理程序 (15.3)。 [..]

强调我的

cppreference将其简化为:

  

与其他临时对象不同,异常对象在初始化catch子句参数时被认为是左值参数,因此可以通过左值引用,修改和重新捕获来捕获它。

因此,对于这种情况,您实际上可以将异常绑定到非const左值引用。