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

xml*_*lmx 13 c++ rvalue rvalue-reference move-semantics c++11

#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? 
}
Run Code Online (Sandbox Code Playgroud)

C++ 11保证f(A().coll)会打电话void f(vector<int>&&)吗?

Pot*_*ter 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.

  • 它于2013年更改,请参阅https://github.com/cplusplus/draft/commit/728faf012696b81f906af77a1b22a8996dd7fa22以解决CWG616:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html# 616 (3认同)