7

实际上,我在网上看到的每一个左值到右值转换的例子都与基本类型有关,例如intetc。

我自己找不到适用于类类型的 l2r 示例;在所有看似适用的示例中,通常有一个函数涉及 lvalue-ref(如 copy-ctor),l2r 似乎被抑制(参见例如这个问题)。

然而,在 l2r 本身的描述中有一个关于类类型的子句(来自 [conv.lval]):

转换结果根据以下规则确定:

<...> 如果 T 具有类类型,则转换从泛泛值复制初始化 T 类型的临时,并且转换的结果是临时的纯右值。

有人可以举一个这个条款的例子吗?我不能。

4

1 回答 1

4

一个例子是废弃值表达式中的 volatile 对象:

struct A {};

void f()
{
    volatile A a;
    a;
} 

根据[expr.context]/2

在某些情况下,表达式只出现在它的副作用上。这样的表达式称为弃值表达式。不应用数组到指针和函数到指针的标准转换。当且仅当表达式是 volatile 限定类型的左值并且它是以下之一时,才应用左值到右值的转换

  • ...
  • id 表达式,
  • ...

左值到右值的转换应用于a.

于 2020-04-02T06:16:43.693 回答