什么时候可以做/使用具有未指定行为的东西?

时间:2014-07-17 20:45:35

标签: c++ undefined-behavior unspecified-behavior relaxed-atomics

在C ++中,有些东西出现在明确定义和未定义之间。具体而言,这些被称为实现定义未指定。现在,我对未指明的东西感兴趣。

什么时候可以使用这些功能,什么时候应该避免?是否有正确代码的未指定行为的良好示例?在编写软件时,它是否是最佳选择?

Matt McNabb提供的定义:

  • 未定义 - 任何事情都可能发生

  • 实现定义 - 可能有限数量的结果,编译器的文档必须说明会发生什么

  • 未指定 - 可能会产生有限数量的结果 - 通常标准会描述可能结果的集合

  • 定义明确 - 以上都不是

  • 格式良好的程序 - 无错误编译的程序(可能会出现未定义的行为)

后续问题:

放松的原子是否被指定为未指定或明确定义?

标记为从不同角度谈论相同想法的问题的副本。标记为相同的问题是关于未指定行为的定义,而这里的问题是关于如何以及何时使用它。

1 个答案:

答案 0 :(得分:6)

要回答新问题,“何时可以使用未指定的行为?”

这可能听起来有点滑稽,但“任何时候对你来说无关紧要”。

例如,

int foo() { cout << "foo"; return 1; }
int bar() { cout << "bar"; return 2; }
// ...
cout << (foo() + bar()) << "\n";

如果您不在乎是否看到“foobar3”或“barfoo3”,那么您可以编写此代码。如果它确实重要,那么你将不得不改变它,例如

int i = foo(); i += bar(); cout << i << "\n";

订单未指定,因为在更一般的情况下,为编译器留出自由选择最佳顺序是很好的。