围绕std :: make_index_sequence的空括号

时间:2016-11-30 20:36:24

标签: c++ tuples c++14

在CppR的this示例中:

template<typename Array, std::size_t... I>
decltype(auto) a2t_impl(const Array& a, std::index_sequence<I...>)
{
    return std::make_tuple(a[I]...);
}

template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>>
decltype(auto) a2t(const std::array<T, N>& a)
{
    return a2t_impl(a, Indices());
}

template<typename Func, typename Tup, std::size_t... index>
decltype(auto) invoke_helper(Func&& func, Tup&& tup, std::index_sequence<index...>)
{
    return func(std::get<index>(std::forward<Tup>(tup))...);
}

template<typename Func, typename Tup>
decltype(auto) invoke(Func&& func, Tup&& tup)
{
    constexpr auto Size = std::tuple_size<typename std::decay<Tup>::type>::value;
    return invoke_helper(std::forward<Func>(func),
                         std::forward<Tup>(tup),
                         std::make_index_sequence<Size>{});
}

这些线路让我很困惑:

std::make_index_sequence<N>
std::make_index_sequence<Size>{}

为什么有时会在最后添加花括号(并省略它们会导致编译错误),为什么它们有时不会?

2 个答案:

答案 0 :(得分:3)

std::make_index_sequence理想地定义为:

template<std::size_t N>
using make_index_sequence = make_integer_sequence<std::size_t, N>;

std::make_integer_sequence理想地定义为:

template<class T, T N>
using make_integer_sequence = std::integer_sequence<T, /* a sequence 0, 1, 2, ..., N-1 */ >;

std::integer_sequence是来自utility标题的类型:

template< class T, T... Ints >
class integer_sequence;

因此,您可以将其用作任何其他类型并调用其默认构造函数,这一点都不奇怪。

有关详细信息,请参阅here

答案 1 :(得分:3)

第一个实例(std::make_index_sequence<N>)用于模板参数列表。它只是说模板类型参数Indices默认为类型std::make_index_sequence<N>。在那里没有创建任何实例,使用是声明性的。

第二个实例(std::make_index_sequence<Size>{})正在创建该类型的默认构造实例。 {}是用于初始化的新C ++语法。当大括号为空时,对象将默认构造。