为什么此函数调用中没有使用最终的默认参数?

Zeb*_*ish 2 c++ templates

template <typename T>
void loopAndCompress(int value, T&& t = int())
{
}
int main()
{
    loopAndCompress(1);
}
Run Code Online (Sandbox Code Playgroud)

无法推断出 T 的模板参数

为什么它不推断类型?默认参数不适用于模板类型吗?

rua*_*akh 6

事实上,默认参数的类型不用于推导类型参数;这是https://en.cppreference.com/w/cpp/language/template_argument_deduction的“非推导上下文”下的第 4 项。

但是,您可以指定在类型推导失败时使用的默认模板参数:

template <typename T = int>
void loopAndCompress(int value, T&& t = int())
{
}
Run Code Online (Sandbox Code Playgroud)

(向 Raymond Chen 指出这一点致敬。)

  • 或者写“template&lt;typename T = int&gt;”。 (2认同)
  • `T&amp;&amp; t = std::decay_t&lt;T&gt;()` 以防有人执行 `loopAndCompress&lt;int const&amp;&gt;(0)`。(如果有人执行“loopAndCompress&lt;int&amp;&gt;(0)”,那么你就注定失败,因为左值引用无法绑定到纯右值。) (2认同)