临时对象的数据成员是 C++11 中的 xvalue 吗?
Is a data member of a temporary object an xvalue in 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?
}
C++11 保证 f(A().coll)
会调用 void f(vector<int>&&)
吗?
是的。 C++14 标准,§5.2.5/4.2,给定 E1.E2
:
If E2
is a non-static data member and the type of E1
is “cq1 vq1 X”, and the type of E2
is “cq2 vq2 T”, the expression designates the named member of the object designated by the first expression. If E1
is an lvalue, then E1.E2
is an lvalue; otherwise E1.E2
is an xvalue.
迂腐地,最初C++11把它归类为纯右值,但这样的归类没有意义所以改了。但是,如果更改是由缺陷报告应用的,那么它具有追溯力——已发布的 C++11 标准文档 N3290 是错误的,而 C++14 文档定义了 C++11。这很可能是这种情况,否则将需要编译器在 -std=c++11
和 -std=c++14
之间实现细微的行为差异。我现在懒得搜索DR了。
#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
:
If
E2
is a non-static data member and the type ofE1
is “cq1 vq1 X”, and the type ofE2
is “cq2 vq2 T”, the expression designates the named member of the object designated by the first expression. IfE1
is an lvalue, thenE1.E2
is an lvalue; otherwiseE1.E2
is an xvalue.
迂腐地,最初C++11把它归类为纯右值,但这样的归类没有意义所以改了。但是,如果更改是由缺陷报告应用的,那么它具有追溯力——已发布的 C++11 标准文档 N3290 是错误的,而 C++14 文档定义了 C++11。这很可能是这种情况,否则将需要编译器在 -std=c++11
和 -std=c++14
之间实现细微的行为差异。我现在懒得搜索DR了。