【发布时间】:2021-04-23 00:27:40
【问题描述】:
考虑以下示例:
#include <type_traits>
struct A {};
template <A const i> void f() {
static_assert(std::is_same_v<decltype(i), A const>); // #1
A& ar = i; // #2
}
int main() {
f<A{}>();
}
Clang(1) 和 GCC(1) 都拒绝,并出现以下两个看似冲突的错误:
#1 error: static_assert failed due to requirement 'std::is_same_v<A, const A>' #2 error: binding reference of type 'A' to value of type 'const A' drops 'const' qualifier
另外,如果我们将非类型模板参数的类型改为占位符类型,如下:
template <auto const i> void g() {
static_assert(std::is_same_v<decltype(i), A const>); // #1
A& ar = i; // #2
}
然后 GCC 接受 #1,而 Clang 拒绝它(都拒绝 #2 如上所述)。
这里发生了什么,哪个编译器是正确的(如果有的话)?
(1) GCC HEAD 11.0.0 20210117 和 Clang HEAD 12.0.0 (20210118),-std=c++20.
【问题讨论】:
-
如果你也能链接问题的godbolt示例,那就太好了
标签: c++ templates gcc clang language-lawyer