首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`const &&’绑定到所有的prvalue(和xvalue)吗?

‘`const &&’绑定到所有的prvalue(和xvalue)吗?
EN

Stack Overflow用户
提问于 2014-07-24 20:12:30
回答 2查看 1.2K关注 0票数 7

C++标准定义了被删除的以下功能;

代码语言:javascript
复制
template <class T>
void ref(const T&&) = delete;

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

这是为了帮助确保这些函数不被滥用,因为不允许函数绑定到临时值(Rvalue)。

  • const &&是否绑定到所有的rvalue,特别是prvalue?
  • const &&会绑定到所有“移动对象”(xvalue;基本上是从std::move或类似的东西返回的东西)吗?

我可以推断应该这样做,但我没有任何“证据”。

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

注意:从注释中可以看出,这个问题很大程度上取决于经典的prvalue,即prvalue值类别。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-24 20:55:28

T const&&可以绑定到Tconst 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

票数 4
EN

Stack Overflow用户

发布于 2014-07-25 12:48:40

我想在这里补充一些经验证据来支持这个答案。

代码语言:javascript
复制
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都在编译失败时出现了相应的“试图引用已删除函数”错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24943093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档