【问题标题】:constexpr optimization error in gcc6.x?gcc6.x 中的 constexpr 优化错误?
【发布时间】:2016-12-14 02:40:43
【问题描述】:

我的 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 函数中使用后增量吗?

【问题讨论】:

  • 这在我看来像是一个编译器错误。
  • 我也是这么认为的,但在提交之前,我认为额外的一双眼睛会有所帮助 - 你永远不知道什么时候你会拥有其中一个“doh!!!”时刻!
  • 这并不复杂。 sum += s[pos++]; 逻辑上等价于sum += s[pos]; ++pos;,不存在顺序歧义。是时候把它包起来了。是时候提交 bugzilla 错误了。
  • 正如我所说,我认为这是一个错误。在提交报告之前获得第二意见从来没有什么坏处——现在就提交。
  • 如果您的问题只是包含不起作用的代码,作为 MCVE,那会更清楚。发布一些有效的代码并说“改变这个,那个和另一个,它在编译器 X 上不起作用”是令人困惑的

标签: c++ c++11 gcc c++14 language-lawyer


【解决方案1】:

正如您所料,您拥有的功能非常好。 C++14 中的constexpr 没有规则不允许您选择的特定形式,但允许您尝试并成功使用的所有各种逻辑等效版本。

这是gcc bug 77553,已在 gcc 6.3 中解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2017-05-22
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多