在C++中,能够结合一个临时到const引用:有没有办法禁用绑定到const引用的临时?
struct A {};
int main() {
const A& a = A();
}
有没有任何禁用此对于某些特定的类A,使得它不可能结合的临时这个类的一个const引用?
在C++中,能够结合一个临时到const引用:有没有办法禁用绑定到const引用的临时?
struct A {};
int main() {
const A& a = A();
}
有没有任何禁用此对于某些特定的类A,使得它不可能结合的临时这个类的一个const引用?
一般来说,似乎没有办法禁用将临时绑定到const引用的方法。
然而,得到证实的答案,我想举C++ 2003标准:
如果初始化表达式是一个rvalue,与T2的类类型,和“CV1 T1”是参考 - 与“cv2 T2”兼容的 ,参考以下列方式之一进行绑定(选择是实现定义的):
- 引用绑定到由右值表示的对象(参见3.10)或 该对象内的子对象。
- 创建“cv1 T2”类型的临时文件[原文如此],并调用构造函数将整个对象复制到临时对象中。该参考在临时范围内与临时或临时对象 相关联。 93)
无论副本是否实际完成,用于制作副本的构造函数都应该可调用。
所以它看起来,这可以在C++ 03可以实现通过使拷贝构造函数私有:
struct A {
A() {}
private:
A(const A&);
};
int main() {
const A& a = A();
}
但是,这不会与流行的编译工作。例如,即使使用-std=c++03
标志,GCC也会接受上述代码。铛也接受这个代码,但有一个警告:
test.cc:8:12:警告:C++ 98需要用于类可访问的拷贝构造“A” 结合到一个临时的参考时;是私人的
因此违反标准是没有办法做到这一点。
在这种情况下,C++ 11不再需要可访问的拷贝构造函数。
只是出于速度,为什么你需要这样做? – 2012-12-11 16:12:41
我不需要这个,只是询问curiocity =) – vitaut
这个例子很愚蠢,但是你可能想直接绑定一个引用到某个对象,即使引用是const。 – curiousguy