首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >易失性类类型的丢弃值表达式与易失性内建类型的行为不同。

易失性类类型的丢弃值表达式与易失性内建类型的行为不同。
EN

Stack Overflow用户
提问于 2018-03-04 11:26:42
回答 1查看 439关注 0票数 13

请考虑以下代码:

代码语言:javascript
运行
复制
struct S{
  int i;
  S(int);
  S(const volatile S&);
  };

struct S_bad{
  int i;
  };

volatile S     as{0};
volatile S_bad as_bad{0};
volatile int   ai{0};

void test(){
   ai;     //(1)=> a load is always performed
   as;     //(2)=> Should call the volatile copy constructor
   as_bad; //(3)=> Should be ill-formed
   }

表达式ai;as;as_bad是废弃的值表达式,根据C++草案标准N 4659/[expr].12,我预计lvalue对rvalue将适用于这三种情况。对于(2)情况,这将导致对易失性副本构造函数(S(const volatile S&)) [expr]/12的调用。

...If表达式是在此可选转换之后的prvalue,则应用临时物化转换(conv.rval)。注意:如果表达式是类类型的lvalue,它必须有一个易失性的复制构造函数来初始化临时的,即lvalue到rvalue转换的结果对象。-尾注

因此,案件(3)应该是畸形的。

然而,编译器的行为似乎很混乱:

  1. GCC:
代码语言:javascript
运行
复制
- `ai;` => loads the value of `ai`;
- `as;` => no code generated, no warning;
- `as_bad;` => loads `as_bad.i`.

  1. Clang不为case (2)生成一个load,并生成警告:表达式结果未使用;赋值到一个变量中,以强制执行一个易失性负载-case volatile。
代码语言:javascript
运行
复制
- `ai;` => loads the value of `ai`;
- `as;` => no code generated; warning _expression result unused; assign into a variable to force a volatile load [-Wunused-volatile-lvalue]_
- `as_bad;` => same as `as;`.

  1. MSVC在这两种情况下都执行加载。
代码语言:javascript
运行
复制
- `ai;` => loads the value of `ai`;
- `as;` => loads `as.i` (without calling to the volatile copy constructor)
- `as_bad;` => loads `as_bad.i`.

我根据标准所期望的内容摘要:

  • ai; =>加载ai的值;
  • as; =>调用以as为参数的S(const volatile S&)
  • as_bad; =>生成编译错误

我对标准的解释对吗?哪个编译器是正确的,如果有的话?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-09 21:56:09

  1. C++03说,从lvalue到rvalue的转换不会发生在表达式语句的结果上,也不会明确地说在转换发生时会发生副本。
  2. C++11说,正如您所说的,这种转换确实发生在易失性对象上,并且转换涉及复制以使一个临时对象。
  3. C++14只是清理了措辞(以避免b ? (x,y) : z等愚蠢的东西,如果y没有计算),并添加了有关易失性复制构造函数的注释。
  4. C++17应用临时物化转换来保留先前的含义。

因此,我的结论是(就C++11而言)您是正确的,所有的编译器都是错误的。特别是,除非复制构造函数读取,否则不应该发生S::i加载。当然,"access“的实现定义性质与格式良好的问题无关;它只影响ai的load指令是否实际生成。存在S_bad是一个聚合的问题,但这是不相关的,因为它没有被列表初始化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49094866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档