在C ++中,有些东西出现在明确定义和未定义之间。具体而言,这些被称为实现定义和未指定。现在,我对未指明的东西感兴趣。
什么时候可以使用这些功能,什么时候应该避免?是否有正确代码的未指定行为的良好示例?在编写软件时,它是否是最佳选择?
Matt McNabb提供的定义:
未定义 - 任何事情都可能发生
实现定义 - 可能有限数量的结果,编译器的文档必须说明会发生什么
未指定 - 可能会产生有限数量的结果 - 通常标准会描述可能结果的集合
定义明确 - 以上都不是
格式良好的程序 - 无错误编译的程序(可能会出现未定义的行为)
后续问题:
放松的原子是否被指定为未指定或明确定义?
答案 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";
订单未指定,因为在更一般的情况下,为编译器留出自由选择最佳顺序是很好的。