【发布时间】:2017-02-09 09:43:56
【问题描述】:
考虑this代码:
#include <type_traits>
template < int > struct II { };
template < const int& > struct RR { };
template < template <auto> typename Class, typename Type > struct Check : std::false_type { };
template < template <auto> typename Class, auto NonTypes > struct Check<Class,Class<NonTypes>> : std::true_type { };
constexpr int TEN = 10;
constexpr const int& REF = TEN;
static_assert(Check<II,II<TEN>>::value); // passes
static_assert(Check<RR,RR<REF>>::value); // FAILS!?
我使用的是 gcc-7.0.1,here 是一个活生生的例子。问题是这是编译器错误还是我做错了什么?
【问题讨论】:
-
只是我的猜测:普通的
auto(来自NonTypes)无法推断出与const int&在Class下推断的内容相匹配的引用类型(至少它适用于@ 987654328@) -
@PiotrSkotnicki 与
decltype(auto)一起工作难道不是很有意义吗? -
@user975989 我认为匹配模板特化归结为推导发明的函数模板的类型,其中
decltype(auto)没有用
标签: c++ templates c++17 auto non-type