【发布时间】:2018-07-11 19:29:10
【问题描述】:
我设法重现问题的最简单的 sn-p 如下:
#include <variant>
template <auto V>
using ic = std::integral_constant<decltype(V), V>;
enum { shake };
int milk(ic<shake>);
template <class...>
struct context {
template <auto V>
decltype(milk(ic<V>{})) get() {
return std::get<decltype(milk(ic<V>{}))>(value);
}
std::variant<int> value;
};
int main(){
context<int> c;
c.get<shake>();
}
[clang] 中发生了一些可疑的事情,因为它表明:
prog.cc:13:42: error: a non-type template parameter cannot have type 'auto'
return std::get<decltype(milk(ic<V>{}))>(value);
^
prog.cc:3:16: note: template parameter is declared here
template <auto V>
^
1 error generated.
当我们将ic 更改为别名类型或使用context 的非模板版本时,一切都会按预期工作。那么它真的是clang的错误还是我在这里遗漏了一些明显的东西?
附言。在[gcc] 中,一切都按预期工作......
【问题讨论】:
-
顺便说一句,根据我的经验,
std::integral_constant<std::decay_t<decltype(V)>, V>;在某些情况下工作得更好一些;可能是由于auto实现中的早期缺陷,因为auto应该已经适合存储。我不确定。 -
有一些 clang 错误使类成为模板会导致代码无法编译。这很可能是其中的另一个。
-
另外,为什么不使用
std::invoke_result_t而不是decltype(milk(ic<V>{}))? -
是的,是Clang bug。
-
@xskxzr 当然看起来这个错误报告可能涵盖了这个问题,谢谢...
标签: c++ templates language-lawyer auto c++17