有没有办法禁用临时绑定到const引用?

时间:2012-12-11 15:55:48

标签: c++ reference object-lifetime

在C ++中,可以将临时绑定到const引用:

struct A {};

int main() {
  const A& a = A();
}

有没有办法为某个特定的A类禁用它,这样就不可能将这个类的临时值绑定到const引用?

2 个答案:

答案 0 :(得分:6)

不,如果你需要这样做,那你就做错了。

答案 1 :(得分:2)

通常,似乎没有办法禁用将临时绑定到const引用。

但是,为了给出一个经证实的答案,我想引用C ++ 2003标准:

  

如果初始化表达式是rvalue,T2是类类型,“cv1 T1”是参考兼容的   使用“cv2 T2”,引用以下列方式之一绑定(选择是实现定义的):

     

- 引用绑定到由rvalue(参见3.10)表示的对象或其中的子对象   那个对象。

     

- 创建一个临时类型为“cv1 T2”[sic],并调用构造函数来复制整个   rvalue对象进入临时对象。引用绑定到临时对象或子对象   在临时。   93)

     

无论副本是否真正完成,用于制作副本的构造函数都应该是可调用的。

所以看起来这可以通过将拷贝构造函数设为私有来在C ++ 03中实现:

struct A {
  A() {}
 private:
  A(const A&);
};

int main() {
  const A& a = A();
}

然而,这不适用于流行的编译器。例如,GCC即使使用-std=c++03标志也接受上述代码。 Clang也接受这个代码,但有警告:

  

test.cc:8:12:警告:C ++ 98需要一个类'A'的可访问拷贝构造函数         绑定对临时的引用;是私人的

因此,与标准相反,没有办法做到这一点。

在这种情况下,

C ++ 11不再需要可访问的复制构造函数。