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

Mic*_*nda -2 c++ undefined-behavior unspecified-behavior relaxed-atomics

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

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

Matt McNabb提供的定义:

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

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

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

  • 定义明确 - 以上都不是

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

后续问题:

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

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

M.M*_*M.M 6

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

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

例如,

int foo() { cout << "foo"; return 1; }
int bar() { cout << "bar"; return 2; }
// ...
cout << (foo() + bar()) << "\n";
Run Code Online (Sandbox Code Playgroud)

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

int i = foo(); i += bar(); cout << i << "\n";
Run Code Online (Sandbox Code Playgroud)

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