【发布时间】:2022-01-06 22:27:20
【问题描述】:
下面的程序
template<class T>
consteval auto foo(const T&) {
return 0;
}
template<class T>
consteval auto bar(const T& t) {
auto n = foo(t);
return n;
}
int main() {
static_assert(foo("abc") == 0);
static_assert(bar("abc") == 0);
}
在 GCC 中构建良好,但 Clang 用消息拒绝它:
error: call to consteval function 'foo<char[4]>' is not a constant expression
note: in instantiation of function template specialization 'bar<char[4]>' requested here
static_assert(bar("abc") == 0);
note: function parameter 't' with unknown value cannot be used in a constant expression
auto n = foo(t);
演示:https://gcc.godbolt.org/z/M6GPnYdqb
这是 Clang 中的一些错误吗?
【问题讨论】:
-
注意:这种编译器差异不仅会出现在引用参数上,还会出现在指针上。
-
惊喜,我将
consteval auto bar(const T& t)更改为consteval auto bar(T t)然后编译为clang。希望有人能澄清这一点。 -
@Evg:请注意,将
consteval替换为constexpr有效Demo。 -
这是stackoverflow.com/questions/69166564 的副本但是,这个问题的措辞更好(更清晰的标题和更清晰的代码 sn-p)。此外,该副本的答案并不是特别有用,所以我将继续使用这个问题作为目标,一旦(如果)得到回答。
标签: c++ language-lawyer c++20 consteval