2

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

struct A {};

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

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

4

2 回答 2

6

不,如果你需要这样做,你做错了什么。

于 2012-12-11T15:56:56.617 回答
2

一般来说,似乎没有办法禁用将临时绑定到 const 引用。

但是,为了给出一个有根据的答案,我想引用 C++ 2003 标准:

如果初始化表达式是右值,T2 是类类型,并且“cv1 T1”与“cv2 T2”引用兼容,则引用以下列方式之一绑定(选择由实现定义):

— 引用绑定到由右值表示的对象(参见 3.10)或该对象内的子对象。

— 创建了一个“cv1 T2”[sic] 类型的临时对象,并调用构造函数将整个右值对象复制到临时对象中。引用绑定到临时对象或临时对象中的子对象。93)

无论复制是否实际完成,用于制作复制的构造函数都应该是可调用的。

因此,这似乎可以在 C++03 中通过将复制构造函数设为私有来实现:

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

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

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

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

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

在这种情况下,C++11 不再需要可访问的复制构造函数。

于 2012-12-16T05:56:33.990 回答