为什么在这种情况下非类型模板参数不能自动?

时间:2018-02-01 12:56:50

标签: c++ templates language-lawyer auto c++17

我设法重现问题的最简单的片段如下:

#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]中,一切都按预期工作......

1 个答案:

答案 0 :(得分:2)

由xskxzr评论的

Clang bug