以下C++程序编译得很好(g ++ 5.4至少在调用时发出警告-Wall):
int main(int argc, char *argv[])
{
int i = i; // !
return 0;
}
Run Code Online (Sandbox Code Playgroud)
甚至像
int& p = p;
Run Code Online (Sandbox Code Playgroud)
被编译器吞噬了.
现在我的问题是:为什么这样的初始化合法?是否有任何实际的用例,或者它只是语言的一般设计的结果?
仅仅因为编译器接受它(语法上有效的代码)并不意味着它具有明确定义的行为。
编译器不需要诊断所有未定义行为或其他类别问题的情况。该标准赋予它相当大的自由度来接受和翻译损坏的代码,假设如果结果是未定义的或无意义的,程序员就不会编写该代码。
所以; 编译器没有发出警告或错误并不能以任何方式证明您的程序具有明确定义的行为。您有责任遵守语言规则。编译器通常会试图通过指出明显的缺陷来帮助您,但最终要由您来确保您的程序有意义。
类似的东西int i = i;没有意义,但在语法上是正确的,因此编译器可能会也可能不会警告您,但无论如何它都有权生成垃圾(而不告诉您),因为您违反了规则并调用了 Undefined行为。
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |