2012-12-11 71 views
1

在C++中,能够结合一个临时到const引用:有没有办法禁用绑定到const引用的临时?

struct A {}; 

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

有没有任何禁用此对于某些特定的类A,使得它不可能结合的临时这个类的一个const引用?

+0

只是出于速度,为什么你需要这样做? – 2012-12-11 16:12:41

+0

我不需要这个,只是询问curiocity =) – vitaut

+0

这个例子很愚蠢,但是你可能想直接绑定一个引用到某个对象,即使引用是const。 – curiousguy

回答

7

不,如果你需要这样做,你会做别的错事。

+0

其实根据C++ 03有一种方法可以做到这一点,但它不适用于流行的编译器。详情请参阅我的回答。 – vitaut

2

一般来说,似乎没有办法禁用将临时绑定到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不再需要可访问的拷贝构造函数。

相关问题