【问题标题】:Why in this context can a non-type template parameter not be auto?为什么在这种情况下非类型模板参数不能是自动的?
【发布时间】: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&lt;std::decay_t&lt;decltype(V)&gt;, V&gt;; 在某些情况下工作得更好一些;可能是由于auto 实现中的早期缺陷,因为auto 应该已经适合存储。我不确定。
  • 有一些 clang 错误使类成为模板会导致代码无法编译。这很可能是其中的另一个。
  • 另外,为什么不使用std::invoke_result_t 而不是decltype(milk(ic&lt;V&gt;{}))
  • 是的,是Clang bug
  • @xskxzr 当然看起来这个错误报告可能涵盖了这个问题,谢谢...

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


【解决方案1】:

Clang bug 由 xskxzr 评论

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2017-05-20
    • 2021-11-16
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多