std::exchange 默认模板参数规范

use*_*729 5 c++

我想了解为什么模板参数U默认为T下面的动机,即什么时候不从函数参数推导出来?

template<class T, class U = T>
  constexpr T exchange(T& obj, U&& new_val)
{
    T old_val = std::move(obj);
    obj = std::forward<U>(new_val);
    return old_val;
}
Run Code Online (Sandbox Code Playgroud)

pao*_*olo 6

论文N3668 通过以下两个示例激发了第二个模板参数的默认值:

// (1)
DefaultConstructible x = ...;
if (exchange(x, {})) { ... }
Run Code Online (Sandbox Code Playgroud)
// (2)
int (*fp)(int);
int f(int);
double f(double);
/*...*/ exchange(fp, &f) /*...*/
Run Code Online (Sandbox Code Playgroud)

所以,基本上,这是为了方便。上述例子的优点是:

  1. 允许传递默认构造DefaultConstructiblenew_val不必拼写其类型名称;
  2. 进行演员阵容&fint (*)(int)不必要的。