临时对象的数据成员是C ++ 11中的xvalue吗?

时间:2017-02-24 16:59:28

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

#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<int>&&)吗?

1 个答案:

答案 0 :(得分:9)

是。 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将其归类为prvalue,但这种分类毫无意义,所以它被改变了。但是,如果更改是由缺陷报告应用的,那么它是追溯性的 - 已发布的C ++ 11标准文档N3290是错误的,而C ++ 14文档则定义了C ++ 11。这可能就是这种情况,否则需要编译器在-std=c++11-std=c++14之间实现行为的细微差别。我现在懒于搜索DR。