在a C++ 标准提案中,我发现了一个奇怪的代码片段如下:
template <input_iterator I, sentinel_for<I> S, nothrow_forward_iterator I2>
constexpr auto uninitialized_copy(I first, S last, I2 d_first) -> I2 {
using T = iter_value_t<I2>;
I2 current = d_first;
try {
for (; first != last; ++first, (void)++current) {
::new (std::addressof(*current)) T(*first);
}
} catch (...) {
std::destroy(d_first, current);
throw;
}
}
为什么使用
(void)++current
而不仅仅是 ++current
在这里?
++first, (void)++current
使用逗号运算符 ,
。
如果
++first
计算为类型 T
和 ++current
计算为类型 U
并且存在适用于 operator,
/T
参数的 U
重载,则这将称为 operator,
重载.
但是,它并不是为了被调用而设计的。通过使两个操作数之一具有类型
void
,就不可能选择 ,
的重载,并且它将始终具有内置含义。