`const &&`是否绑定到所有prvalues(和xvalues)?

Nia*_*all 7 c++ rvalue rvalue-reference language-lawyer c++11

C++标准定义了以下删除的函数;

template <class T>
void ref(const T&&) = delete;

template <class T>
void cref(const T&&) = delete;
Run Code Online (Sandbox Code Playgroud)

这是为了通过禁止函数绑定到临时值(rvalues)来帮助确保函数不被滥用.

  • 是否const &&绑定到所有rvalues,特别是prvalues?
  • const &&绑定到所有"移动的对象"(xvalues;基本上是从std::move或类似的东西返回)?

我可以说它应该,但我没有任何"证据".

  • 或者相反,是否存在rvalue(prvalue或xvalue)不会绑定的情况const &&
    • 如果是这样,怎么会这样?

注意:评论中的一些清晰度,这个问题严重影响经典的右值,prvalue值类别.

eca*_*mur 4

T const&&可以绑定到类型T或的右值const T

\n\n

从 8.5.3 [dcl.init.ref]第 5 段开始:

\n\n
\n

5 - 对类型“cv1 T1”的引用由类型“cv2 T2”的表达式初始化,如下所示: [...]
\n \xe2\x80\x94 否则,[...] 引用应为右值参考。[...]
\n \xe2\x80\x94 如果初始化表达式
\n \xe2\x80\x94 是 xvalue、类纯右值、数组纯右值或函数左值,并且“cv1 T1”与“cv2 T2”引用兼容" [...]\n 那么引用将绑定到初始化表达式的值 [...]

\n
\n\n

如果初始化表达式是非类类型的纯右值,则为引用绑定创建临时副本(同上)。

\n\n

参考兼容性在 8.5.3p4 中定义;它需要相同或基本类别的关系以及相同或更高的简历资格。

\n\n

因此,对于要绑定到 的右值T const&&,其 cv 限定必须不大于const

\n

  • 但正如 hvd 在问题注释中指出的那样,因为“T”是推导出来的,所以该函数仍然可以采用“易失性”限定的参数。“易失性”只是成为推导的“T”的一部分。 (3认同)