xry*_*669 2 c++ clang undefined-behavior
这是示例代码:
X * makeX(int index) { return new X(index); }
struct Tmp {
mutable int count;
Tmp() : count(0) {}
const X ** getX() const {
static const X* x[] = { makeX(count++), makeX(count++) };
return x;
}
};
Run Code Online (Sandbox Code Playgroud)
这将在静态数组构造中报告CLang build 500上的Undefined Behavior.为了简化这篇文章,计数不是静态的,但它不会改变任何东西.我收到的错误如下:
test.cpp:8:44:警告:对'count'的多次无序修改[-Wunsequenced]
Mik*_*our 10
在C++ 11中,这很好; 初始化列表的每个子句在下一个列表之前排序,因此评估是明确定义的.
从历史上看,这些条款可能没有排序,因此两个count未经修改的条款会给出未定义的行为.
(虽然,正如评论中所指出的那样,它可能已经定义得很好 - 你可以将标准解释为暗示每个子句都是一个完整表达式,并且在每个完整表达式的末尾都有一个序列点.我会留给历史学家来讨论过时语言的细节.)
| 归档时间: |
|
| 查看次数: |
2293 次 |
| 最近记录: |