gpt4 book ai didi

c++ - volatile 类类型的丢弃值表达式与 volatile 内置类型的行为不同

转载 作者:可可西里 更新时间:2023-11-01 15:25:34 27 4
gpt4 key购买 nike

考虑以下这段代码:

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++ 草案标准N4659/[expr].12我希望 lvalue-to-rvalue会适用于这三种情况。对于情况 (2),这应该会导致调用 volatile 复制构造函数 (S(const volatile S&)) [expr]/12

[...]If the expression is a prvalue after this optional conversion, the temporary materialization conversion ([conv.rval]) is applied. [ Note: If the expression is an lvalue of class type, it must have a volatile copy constructor to initialize the temporary that is the result object of the lvalue-to-rvalue conversion. — end note ]

所以情况 (3) 应该是病式的。

然而,编译器的行为似乎很困惑:

  1. 海湾合作委员会:

    • ai; => 载入ai的值;
    • as; => 没有生成代码,没有警告;
    • as_bad; => 加载 as_bad.i
  2. Clang 不会为情况 (2) 生成负载并生成警告:表达式结果未使用;分配到变量中以强制进行 volatile 加载 [-Wunused-volatile-lvalue]

    • ai; => 载入ai的值;
    • as; => 没有生成代码;警告 表达式结果未使用;分配到一个变量中以强制进行 volatile 加载 [-Wunused-volatile-lvalue]
    • as_bad; => 与 as; 相同。
  3. MSVC 在这两种情况下执行加载。

    • ai; => 载入ai的值;
    • as; => 加载 as.i(不调用 volatile 复制构造函数)
    • as_bad; => 加载 as_bad.i

根据标准总结一下我的预期:

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

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

最佳答案

  1. C++03 表示,表达式语句的结果不会发生左值到右值的转换,也没有明确表示无论如何都会发生转换。
  2. C++11 表示,如您所说,转换确实发生在 volatile 对象上,并且转换涉及复制以生成临时对象。
  3. C++14 只是清理了措辞(以避免像 b ? (x,y) : z 这样的傻事,如果 y 算的话)并添加请注意 volatile 复制构造函数。
  4. C++17 应用临时物化转换来保留以前的含义。

所以我的结论是(从 C++11 开始)你是对的,所有的编译器都是错的。特别是,S::i 加载不应该发生,除非您的复制构造函数读取它。当然,“访问”的实现定义性质与格式良好的问题无关;它只影响ai 的加载指令是否实际生成。存在 S_bad 是聚合的问题,但这无关紧要,因为它没有被列表初始化。

关于c++ - volatile 类类型的丢弃值表达式与 volatile 内置类型的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com