【发布时间】:2019-07-12 19:03:27
【问题描述】:
以下内容:
#include <iostream>
int& addone(int& r) {
return ++r;
}
int main() {
std::cout << addone((int&)(int&&)7) << std::endl;
}
使用 clang 编译、运行和打印 8,即使使用 -Wall -Wextra -Werror -pedantic 也是如此。
然而,使用 gcc,它根本无法编译,甚至使用 -fpermissive 也无法编译。
这里哪个是正确的? (最好带引号)
【问题讨论】:
-
请注意,两个编译器都可能是“正确的”。在很多 UB 情况下,编译器不需要打印诊断信息。
-
它所做的“显而易见的事情”是什么?我看不到在尝试增加文字时应该发生任何明显的事情
-
黄金法则是:如果有疑问,gcc 是正确的。这些年来,我发现 clang 是非常宽容的。我从来不会在没有先在 gcc 上测试的情况下发布使用 clang 编译的软件。
-
@sp2danny 你应该edit 你的问题包括预期的行为、观察到的行为和错误消息。
-
@RichardHodges 我见过很多相反的例子。即使 MSVC 是唯一正确的。所以规则是:如果其中一个编译器对 Godbolt 有不同意见,那么肯定有错误。使用您的代码(更有可能)或使用某些编译器。
标签: c++ language-lawyer