为什么这段代码有效:
template<
typename T,
std::enable_if_t<std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}
template<
typename T,
std::enable_if_t<!std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}
Run Code Online (Sandbox Code Playgroud)
并且可以正确区分这两个调用:
Add(1);
Add(1.0);
Run Code Online (Sandbox Code Playgroud)
而以下代码如果编译导致重新定义Add()错误?
template<
typename T,
typename = typename std::enable_if<std::is_same<T, int>::value, T>::type>
void Add(T) {}
template<
typename T,
typename = typename std::enable_if<!std::is_same<T, int>::value, T>::type>
void Add(T) {}
Run Code Online (Sandbox Code Playgroud)
所以如果模板参数是类型,那么我们就重新定义了函数,如果它是非类型的,那么一切都好.
因此,从div函数返回的成员的顺序似乎是实现定义的.
是quot1 日成员或者是rem?
让我们说我做的是这样的:
generate(begin(digits), end(digits), [i = div_t{ quot, 0 }]() mutable {
i = div(i.quot, 10);
return i.rem;
})
Run Code Online (Sandbox Code Playgroud)
当然这里的问题是我不知道我是初始化i.quot还是i.rem在我的lambda捕获中.是否i采用div(quot, 1)唯一的跨平台方式来实现这一目标?