#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>&&)
吗?
答案 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。