C++标准定义了被删除的以下功能;
template <class T>
void ref(const T&&) = delete;
template <class T>
void cref(const T&&) = delete;这是为了帮助确保这些函数不被滥用,因为不允许函数绑定到临时值(Rvalue)。
const &&是否绑定到所有的rvalue,特别是prvalue?const &&会绑定到所有“移动对象”(xvalue;基本上是从std::move或类似的东西返回的东西)吗?我可以推断应该这样做,但我没有任何“证据”。
const &&?的情况?
注意:从注释中可以看出,这个问题很大程度上取决于经典的prvalue,即prvalue值类别。
发布于 2014-07-24 20:55:28
T const&&可以绑定到T或const T类型的rvalue。
dcl.init.ref第5段:
5- "cv1 T1“类型的引用由"cv2 T2”类型的表达式初始化,如下所示: -否则.参考应是参考价值的参考。..。 -如果初始化器表达式 -是x值、类prvalue、数组prvalue或函数lvalue,而"cv1 T1“与"cv2 T2”兼容.然后引用被绑定到初始化表达式的值.
如果初始化器表达式是非类类型的prvalue,则创建一个临时副本以进行引用绑定(同上)。
引用兼容性在8.5.3p4中定义;它需要相同或基本的类关系和相同或更大的cv限定。
因此,要使rvalue绑定到T const&&,它的cv限定必须不大于const。
发布于 2014-07-25 12:48:40
我想在这里补充一些经验证据来支持这个答案。
template <class T>
void ref(T&) {}
template <class T>
void ref(volatile T&) {}
template <class T>
void ref(volatile const T&) {}
template <class T>
void ref(const T&) {}
template <class T>
void ref(const T&&) = delete;
// xvalues
int&& ax();
const int&& bx();
volatile int&& cx();
volatile const int&& dx();
// prvalues
int ap();
const int bp();
volatile int cp();
volatile const int dp();
void test()
{
ref(ax());
ref(bx());
ref(cx());
ref(dx());
ref(ap());
ref(bp());
ref(cp());
ref(dp());
}在本例中,对ref的所有调用都无法编译,无论是x值还是带有cv限定变体的prvalue;msvc、gcc和clang都在编译失败时出现了相应的“试图引用已删除函数”错误。
https://stackoverflow.com/questions/24943093
复制相似问题