请考虑以下代码:
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)应该是畸形的。
然而,编译器的行为似乎很混乱:
- `ai;` => loads the value of `ai`;
- `as;` => no code generated, no warning;
- `as_bad;` => loads `as_bad.i`.
- `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;`.
- `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;
=>生成编译错误我对标准的解释对吗?哪个编译器是正确的,如果有的话?
发布于 2018-03-09 21:56:09
b ? (x,y) : z
等愚蠢的东西,如果y
没有计算),并添加了有关易失性复制构造函数的注释。因此,我的结论是(就C++11而言)您是正确的,所有的编译器都是错误的。特别是,除非复制构造函数读取,否则不应该发生S::i
加载。当然,"access“的实现定义性质与格式良好的问题无关;它只影响ai
的load指令是否实际生成。存在S_bad
是一个聚合的问题,但这是不相关的,因为它没有被列表初始化。
https://stackoverflow.com/questions/49094866
复制相似问题