当涉及参数包时,我可以依赖具有默认值的参数类型推断为空包吗?

时间:2016-07-02 09:41:22

标签: c++ templates variadic-templates c++17 default-parameters

考虑一个例子:

#include <iostream>
#include <tuple>
#include <utility>

template <class... Ts, size_t... Is>
void foo(std::tuple<Ts...> t,
         std::index_sequence<Is...> = {}) {
   if (sizeof...(Ts) != sizeof...(Is)) {
      foo(t, std::make_index_sequence<sizeof...(Ts)>{});
      return;
   }
   (std::cout << ... << std::get<Is>(t));
}

int main() {
   foo(std::make_tuple(1, 2, 3));
}

我假设函数foo的第二个参数的类型默认推导为std::integral_sequence<std::size_t>,因此我不必创建辅助函数来使用Is...索引元组元素,但可以调用foo,第二个参数设置为std::make_index_sequence<sizeof...(Ts)>{}

当涉及参数包时,参数包的参数类型是否可以依赖于空包,或者它是否会导致未定义的行为?

使用g++-6clang++-3.6使用-std=c++1z选项编译的上述代码正在按预期工作。

1 个答案:

答案 0 :(得分:1)

是。你依赖于[temp.arg.explicit]:

  

未以其他方式推导出的尾随模板参数包(14.5.3)将被推导为空的模板参数序列。

什么构成&#34;尾随模板参数包&#34;实际上从来没有完全正确定义,但所有编译器都在这里解释None

那就是说,我不会依赖于此,不是因为它不正确,而是因为它使代码难以理解。特别是因为在这种情况下,可以轻松地提取lambda的所有元素:Is...

std::apply()