【发布时间】: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