c++ - 为什么在该示例中模板参数没有自动推导?

标签 c++ templates variadic-templates

在使用可变参数模板时,我发现:

template <class... Ts> struct tuple {};

template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> 
{
    tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}

    T tail;
};

我只想学会理解这里发生的事情:我们可以通过以下方式实例化这样的元组

tuple<int, double, const char*, const char*, const char*> myTuple(1234, 33.444, "I", "like", "C++");

但不包括:

tuple myTuple2(1234, 33.444, "I", "like", "C++");

为什么编译器无法从给定类型列表中自动推断类型?

如果我这样做

template <class T>
void swap(T& first, T& second) {
   T aux = first;
   first = second;
   second = aux;
}

...
...

swap<int>(a, b);
swap(a, b);

两种变体都是可能的。对于可变参数模板参数来说这是不可能的吗? C++ 使用哪些规则来推断类型?

最佳答案

tuple myTuple2(1234, 33.444, "I", "like", "C++");

是通过调用构造函数来声明变量并初始化,而

swap(a, b);

是一个函数调用。

虽然 C++ 总是有 function template argument deduction ,它不支持class template argument deduction直到 C++17。这就是std::make_tuple的原因存在。因为您无法执行 std::tuple t(1, 2.4),所以您有一个函数并且可以编写 auto t = std::make_tuple(1, 2.4) >.

因此您需要 C++17,并且对于您的示例,您还需要推导指南:

template <class... Ts>
tuple(Ts...) -> tuple<Ts...>;

it works .

关于c++ - 为什么在该示例中模板参数没有自动推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59213728/

相关文章:

c++ - 在 C++11 中将静态 constexpr 数组转换为模板参数

c++ - 获取标题栏双击

c++ - "Eclipse IDE"中的模板函数无法编译

c++ - 为没有模板参数的可变模板递归创建基本情况

c++ - 如何根据可变参数模板的大小自动填充 std::array?

r - 使用 ReporteRs 包加载模板 .pptx 时出错

c++ - const 内的非 const

C++ 字符串比较

c++ - 为什么在 ctor 工作中将临时变量传递给 const ref?

c++ - 模板语法解释