【发布时间】:2019-08-21 13:22:28
【问题描述】:
使用 C++17 auto 模板参数我遇到了另一个 g++/clang++ 分歧。
给定以下简单代码
template <auto>
struct foo;
template <int I>
struct foo<I>
{ };
int main ()
{
foo<42l> f42; // <--- long constant, not int constant
(void)f42; // avoid the "unused variable" warning
}
我看到 clang++(例如 8.0.0)编译 g++(例如 9.2.0)给出以下错误的代码
prog.cc: In function 'int main()':
prog.cc:12:13: error: aggregate 'foo<42> f42' has incomplete type and cannot be defined
12 | foo<42l> f42;
| ^~~
如果我们使用int 常量而不是long 常量,两个编译器都会编译
foo<42> f42; // compile with both clang++ and g++
所以我有两个关于 C++ 语言层的问题
(1) 它是合法的,在 C++17 中,特化一个模板,声明接收一个 auto 模板参数,用于特定类型的值(如我的代码中的 foo 特化)?
(2) 如果前面问题的答案是“是”,那么模板特化可以截取不同(但可转换)类型的值?
问题(2)差不多:是clang++还是g++?
【问题讨论】:
-
如果添加
{}会怎样 - 即。template <auto> struct foo {};? -
@SanderDeDycker - 也编译 g++。但这在我看来几乎是显而易见的(显然,第一个问题的答案是“是”):
42l案例被通用foo<auto>版本拦截。
标签: c++ language-lawyer c++17 template-specialization auto