gpt4 book ai didi

c++ - gcc6.x 中的 constexpr 优化错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:15 25 4
gpt4 key购买 nike

我的 C++11 库中有一个 constexpr 函数,用于对字符串中的字符求和。然后我尝试将该函数更新为 C++14 中更自然的风格,但遇到了一个问题:

constexpr long sumchars11(const char s[], int pos = 0){
return 0 + (s[pos] ? (s[pos] + sumchars11(s, pos+1)) : 0);
}

constexpr long sumchars14(const char s[]){
int pos = 0;
long sum = 0;
while(s[pos]) {
sum += s[pos++];
}
return sum;
}

int main() {
static_assert(sumchars11("1235") == 203, "!"); // ok
static_assert(sumchars14("1235") == 203, "!"); // error on gcc 6.x
// ok on clang
}

如果我将 sumchars14 的主体从:

sum += s[pos++];

看似等价的:

sum += s[pos];
++pos;

static_assert 不再触发。是什么赋予了?我不能在 constexpr 函数中使用后增量吗?

最佳答案

如您所料,您拥有的功能完全没问题。 C++14 中的 constexpr 没有规则禁止您选择的特定形式,但允许您尝试并成功使用的所有各种逻辑等效版本。

这是 gcc bug 77553 , 并在 gcc 6.3 中得到解决。

关于c++ - gcc6.x 中的 constexpr 优化错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41133953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com