我设法重现问题的最简单的片段如下:
#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
时,一切都按预期工作。那真的是铿锵的错误还是我错过了一些明显的东西?
PS。在[gcc]中,一切都按预期工作......