这是在GCC 7.1和clang 4.0上复制的,也是在2017年7月30日的两张快照上复制的。
示例1:调用lambdas时,这两个编译器的行为都不同。
int main()
{
auto sum = [](auto ... a) { return (... + a); };
auto value1{sum(5,5)}; // Having optimization disabled -O0,
// GCC treats this line as if constexpr is there,
// clang doesn't.
constexpr auto value2{sum(1,2,3,4)}; // Both treat this line as constexpr like expected.
// As a result, in GCC, no trace of lambdas in the executable,
// and only one lambda in clang.
return value1 + value2;
}活着 @godbolt
示例2和3:在return语句中调用lambdas,这两个编译器的行为方式相同:运行时评估/无constexpr。
int main()
{
auto sum = [](auto ... a) { return (... + a); };
return sum(5,5) + sum(1,2,3,4); // Both compilers generate 2 lambdas like expected.
}活着 @godbolt
int main()
{
constexpr auto sum = [](auto ... a) { return (... + a); };
return sum(5,5) + sum(1,2,3,4); // Both compilers generate 2 lambdas like expected.
}活着 @godbolt
标准主体允许在编译器之间发生这种情况吗?为什么?
发布于 2017-07-30 10:07:32
调用lambdas时,这两个编译器的行为都不同。
它们可能输出不同的程序集,但它们具有完全相同的行为。这是标准的保证,没有别的了。因此,在这方面,两者都是正确的,因为它们都返回20。
如果可能的话,不必在编译时计算constexpr表达式。没有什么可以禁止调用add的实现,而不是在下面的示例中对其进行优化:
constexpr int add(int lhs, int rhs) {
return lhs + rhs;
}
int main() {
return add(4, 5);
}他们可以,但这并不意味着他们必须。标准试图在编译时给予实现尽可能多的自由,例如允许进行大量的优化,这在一定程度上是为什么未定义的行为和不正确的事物;不需要诊断(如果我错了就纠正我)。
请注意,使用-O3进行编译会导致两个编译器在三个示例中返回20,因此没有区别。
https://stackoverflow.com/questions/45398459
复制相似问题