【问题标题】:Is a data member of a temporary object an xvalue in C++11?临时对象的数据成员是 C++11 中的 xvalue 吗?
【发布时间】:2017-07-15 14:49:04
【问题描述】:
#include <vector>

using namespace std;

struct A
{
    vector<int> coll;
};

void f(const vector<int>&){}
void f(vector<int>&&){}

int main()
{
    f(A().coll); // Is "A().coll" an xvalue? 
}

C++11 是否保证f(A().coll) 会调用void f(vector&lt;int&gt;&amp;&amp;)

【问题讨论】:

标签: c++ c++11 move-semantics rvalue-reference rvalue


【解决方案1】:

是的。 C++14 标准,§5.2.5/4.2,给定E1.E2

如果E2是非静态数据成员,E1的类型是“cq1 vq1 X”,E2的类型是“cq2 vq2 T ”,表达式指定第一个表达式指定的对象的命名成员。如果E1 是一个左值,那么E1.E2 是一个左值; 否则 E1.E2 是一个 xvalue。

学究式地,最初 C++11 将其归类为纯右值,但这样的分类毫无意义,因此被更改。但是,如果更改是由缺陷报告应用的,那么它具有追溯性——已发布的 C++11 标准文档 N3290 是错误的,而 C++14 文档定义了 C++11。很可能就是这种情况,否则将需要编译器在-std=c++11-std=c++14 之间实现细微的行为差异。我现在懒得搜索 DR。

猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
相关资源
最近更新 更多