c++ - C++03 和 C++11 之间的未定义行为有什么区别?

标签 c++ c++11 undefined-behavior c++03

新标准与旧标准具有不同的未定义行为。例如,新的排序规则意味着一些以前未定义的算术运算(由于序列点之间的多次写入等原因)现在被定义了。

那么,对于未定义的行为,我们需要重新学习什么?

最佳答案

在我看来,新规则更难描述和理解。例如考虑:

int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid

我建议在同一个表达式中简单地避免对同一个变量产生多个副作用,这是一个更易于理解的规则。 AFAIK C++0X 改变了一些过去未定义行为而现在合法使用的情况(例如上面两个表达式中的第二个),但请记住,什么是合法的和什么是有区别的是道德的;-) ...没有人强制你使用这些东西。

实际上,在上述情况下,第二个表达式的有效性似乎是无意中发生的,是修复语言中另一个问题 (#222) 的副作用。决定是使表达式有效,因为人们认为将某些内容从 UB 更改为明确定义不会造成任何伤害。然而,我认为虽然这并没有对程序造成任何损害(当然 UB 是最糟糕的问题),但它实际上对语言本身造成了一些损害......改变了一个已经很难解释和理解的规则一个更晦涩的。

IMO C++ 正在继续其从 C 的自然演变,成为一种语言,在该语言中,一堆好看、漂亮且合乎逻辑的语句可以做很棒的事情……而其中另一组同样好看、同样漂亮和同样合乎逻辑的语句反而会让你的电脑爆炸。

关于c++ - C++03 和 C++11 之间的未定义行为有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4379581/

相关文章:

c++ - 在 C++ 应用程序中禁用转换为大写/小写字母的能力

c++ - decltype(std) 是否合法,是否有任何用途?

考虑程序输出

c - 为什么这些构造使用增量前和增量后未定义的行为?

c - 分配评估的顺序(我发现了我的第一个编译器错误吗?)

c++ - 遍历所有值

C++ 将数组传递给方法问题

c++ - 将集合插入/读取到 map 中

c++ - 将类型分配给 typename 关键字

c++ - 如何放置构造 std::map<int, std::array<Class, 2>>?