【发布时间】:2017-02-04 07:20:21
【问题描述】:
给定类型A的定义:
struct A { int i; };
根据规范[expr.ref](我用的是n4618):
(如果
E2是非引用,) ...如果E1是左值,那么E1.E2是左值;否则E1.E2是一个 xvalue...
显然A{}.i 是xvalue;
还考虑到 [dcl.type.simple] :
(for
decltype(e),) — ... 如果e是一个无括号 id 表达式或一个无括号 类成员访问... — 否则,如果e是一个xvalue,decltype(e)是T&&,其中T是e的类型 p>
因此,decltype( ( A{}.i ) ) 将产生 int&&。
但是我尝试了 GCC5.1 和 Clang3.9,它们产生 int,而 vs2015u3 产生 int&&。哪个是正确的?
【问题讨论】:
-
根据我的阅读方式,我同意
int && -
clang 主干works as expected。 n4618 来自 2016 年底,不太可能是 clang 3.9 和 gcc 5.1 的一部分。
-
@NicolBolas 不,IMO
std::move(a)显然是一个 xvalue,因此表达式显然也是一个 xvalue。 -
@skypjack 我检查了我引用的措辞是否与 c++14 草案中的相同。无论如何,您提供的 clang 后备箱符合草稿要求。
-
@NicolBolas 这不是一个重复:对象表达式在那个问题中是一个 xvalue,但在这里是一个prvalue,所以
move(a).m一直是一个 xvalue,但A{}.int_member不是。
标签: c++ c++14 language-lawyer c++17