在 C++ 中,可以将临时对象绑定到 const 引用:
struct A {};
int main() {
const A& a = A();
}
有没有办法为某些特定的类 A 禁用它,这样就不可能将此类的临时绑定到 const 引用?
在 C++ 中,可以将临时对象绑定到 const 引用:
struct A {};
int main() {
const A& a = A();
}
有没有办法为某些特定的类 A 禁用它,这样就不可能将此类的临时绑定到 const 引用?
不,如果你需要这样做,你做错了什么。
一般来说,似乎没有办法禁用将临时绑定到 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 不再需要可访问的复制构造函数。