在C ++中,可以将临时绑定到const引用:
struct A {};
int main() {
const A& a = A();
}
有没有办法为某个特定的A类禁用它,这样就不可能将这个类的临时值绑定到const引用?
答案 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不再需要可访问的复制构造函数。