【问题标题】:template type deduction even with empty list [duplicate]即使使用空列表也可以扣除模板类型[重复]
【发布时间】:2018-11-11 13:32:54
【问题描述】:

我在 cppreference 上读到:

类模板参数推导仅在没有模板时执行 参数列表存在。如果指定了模板参数列表, 不进行扣除。

以下示例:

std::tuple t1(1, 2, 3);              // OK: deduction
std::tuple<int,int,int> t2(1, 2, 3); // OK: all arguments are provided
std::tuple<int> t4(1, 2, 3);         // Error

到目前为止,我的理解是:

  • 当我没有给出模板列表时,temaplte 参数将出现(如第一个元组示例)
  • 当我给空或不是所有参数列表时,会出现错误。

所以在我下面的例子中:

template<typename T1, typename T2>
auto max(T1 a, T2 b) -> typename std::decay<decltype(true? a:b)>::type
{
   return  b < a ? a : b;
}

auto c = ::max('c', 7.2); //<<< Works as template deduction took place
auto d = ::max<int>('c', 7.2);  //<<<< WOrks !!! Why

那么对于最后一行,为什么即使我只提供了一个模板列表(T1)而不是两者都有效?我期待错误!

【问题讨论】:

  • 类模板参数奉献不应投射到函数模板参数推导。设计上存在一些差异。通过修补学习可能会适得其反。
  • @StoryTeller:除了尝试修改示例并找出问题所在之外,我没有其他学习方法。如果有任何其他方式我会取悦她。
  • @StoryTeller :事实上我来到这里是因为我正在阅读 C++ 模板:完整指南,而我仍在基础章节中:D
  • 虽然这里的社区支持这些书籍,但通常最好先读完它们。他们经常在进行时介绍一些东西,以免让人不知所措(修补确实让人不知所措,C++ 是一头野兽)。

标签: c++ templates c++17 template-argument-deduction


【解决方案1】:

类模板参数推导仅在不存在模板参数列表时执行。如果指定了模板参数列表,则不进行推导

这是关于类的推导指南,一个新的 C++17 特性。

在C++17之前也是一个错误

std::tuple t1(1, 2, 3);

因为在 C++17 之前,类必须显式 all 模板参数。

所以在我下面的例子中:

您的示例是关于模板函数的推导。

完全不同的东西。

对于函数,您还可以显式一些模板参数,不一定是全部。

【讨论】:

  • @mmax66:我注意到在发布问题后,我正在尝试将函数更改为仿函数并进行测试。最后一点,for 函数可以提供部分列表参数?
  • @Blood-HaZaRd - “函数可以提供部分列表参数吗?” - 这是一个复杂的论点,有些情况我不完全理解;你应该用一些例子提出一个问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多