3

我一直读到,在函数调用的情况下,临时变量只能与非常量引用参数绑定。

情况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;
}

这会给我带来错误,因为我试图用非常量引用参数绑定临时。

案例2:-

try
{
 throw e;
}
catch ( exception& e )
{
}

我了解到,当我们抛出异常时,真正传递给 catch 的是抛出的原始异常的副本,即为抛出的对象创建一个临时对象,然后将其传递给 catch 子句。

catch 所做的是通过非常量引用捕获此异常。这与我在案例 1 中展示的情况相反。

所以,我的问题是: -

1)是否存在允许将临时绑定到非常量引用的特定场景。

2)如果有那么在允许这些例外时考虑了哪些因素。

4

1 回答 1

5

是否存在允许将临时绑定到非常量引用的特定场景。

对于左值引用(即 type T&)没有。您不能将临时值绑定到非 const 左值引用,因为修改诸如42. 它们可以绑定到const左值引用,因为这样就做出了修改引用绑定到的对象的承诺。

它们实际上可以绑定到rvalue -references ( T&&),但这与该线程无关。

如果有,那么在允许这些例外情况时会考虑哪些因素。

确实,临时对象不能绑定到非 const 左值引用,但是为异常对象做了一些规定:

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

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

强调我的

cppreference将其简化为:

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

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

于 2014-11-07T17:43:33.273 回答