我想了解为什么模板参数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)
论文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)
所以,基本上,这是为了方便。上述例子的优点是:
DefaultConstructible为new_val不必拼写其类型名称;&f是int (*)(int)不必要的。| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |