【发布时间】:2017-02-03 14:18:08
【问题描述】:
假设m 是非引用类型的非静态数据成员(T)。根据cppreference,std::move(a).m 在 c++11 之前是一个prvalue。我想它应该是 c++11 之后的 xvalue。如果我错了,请纠正我。
但是decltype(std::move(a).m) 在 c++14 (visual studio, clang, gcc) 中仍然是T(不是T&&),这表明std::move(a).m 仍然是一个prvalue。那么std::move(a).m 是 xvalue 还是 prvalue?
【问题讨论】:
-
“我猜应该是c++11之后的xvalue” 为什么猜呢?同一篇文章明确指出了这一点。
-
decltype(std::move(a).m)可能属于“无括号类成员访问表达式”special case -
expression_name可以告诉您编译器对此的看法:stackoverflow.com/a/20721887/576911 我的编译器同意 Barry。 -
值类别“prvalue”在 C++11 之前不存在。只有左值和右值,而且,
std::move不存在。所以说move(a).mpre C++11 的值类别是没有意义的。
标签: c++11 c++14 decltype rvalue xvalue