是C 11中XVALUE的数据成员

Is a data member of a temporary object an xvalue in C++11?

本文关键字:数据成员 XVALUE      更新时间:2023-10-16
#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>&&)

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

如果E2是非静态数据成员,并且E1的类型为" cq1 vq1 x ",E2的类型为" cq2 vq2 t ",该表达式指定了第一个表达式指定对象的命名成员。如果E1是lvalue,则E1.E2是lvalue;否则E1.E2是xvalue。

最初是C 11的

将其归类为prvalue,但这种分类毫无意义,因此已更改。但是,如果变更是通过缺陷报告应用的,则是追溯的 - 已发布的C 11标准文档N3290是错误的,而C 14文档代替了C 11。情况很可能是这种情况,因为否则要求编译器在-std=c++11-std=c++14之间的行为差异很小。我现在懒于通过DRS进行搜索。