考虑以下代码:
template <typename... Types>
struct list
{
template <typename... Args>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
};
template <typename... Args>
list(Args...) -> list<Args...>;
int main()
{
list l{0, 0.1, 'a'};
}
我期望decltype(l)
是list<int,double,char>
。不幸的是,g++ 7.2和g++ trunk未通过静态断言测试。clang++ 5.0.0和clang++ trunk编译并按预期工作。
这是g++的一个错误吗? 还是这里有一个不应该遵循推导指南的原因?
在构造函数上添加SFINAE约束似乎提供了所需的行为:
template <typename... Args,
typename = std::enable_if_t<sizeof...(Args) == sizeof...(Types)>>
list(Args...)
{
static_assert(sizeof...(Types) > 0);
}
sizeof...(Types) == 0
,你的模板构造函数没有可行的实例化... - W.F.template<typename... Types, typename... Args> list<Types...> deducer(Args...);
- 它比推导指南的template<typename.... Args> list<Args...> deducer(Args...);
更加专业化,不是吗? - aschepler