【发布时间】: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