【问题标题】:Does lvalue-to-rvalue conversion ever happen to class types?左值到右值的转换是否发生在类类型上?
【发布时间】:2020-07-14 00:06:40
【问题描述】:

我在网上看到的几乎每个左值到右值转换的例子都与int 等基本类型有关。

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

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

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

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

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

【问题讨论】:

  • 有 basic.lval/3 “注意:只要在期望prvalue的上下文中出现glvalue,glvalue就会转换为prvalue”。在某些情况下,标准指定类类型的纯右值符合预期

标签: c++ implicit-conversion lvalue-to-rvalue


【解决方案1】:

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

struct A {};

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

根据[expr.context]/2

在某些情况下,表达式仅出于其副作用而出现。 这样的表达式称为丢弃值表达式。这 数组到指针和函数到指针的标准转换不是 应用。 当且仅当 该表达式是 volatile 限定类型的左值,它是一个 以下

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

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

【讨论】:

  • 那么在该示例中,是否存在从a 临时发生的复制初始化?就像调用的复制ctor 等。我最感兴趣的是子句的复制初始化部分;或者它是否以某种方式被忽略了?..
  • @ledonter 我认为确实有。
  • 嗯 ...GCC and Clang 似乎不是这种情况。事实上,Clang 说的是warning: expression result unused; assign into a variable to force a volatile load [-Wunused-volatile-lvalue]
  • @L.F.有一个bug report
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多