[英]universal references and overloads
假设我在类set_value
有两个方法重载,每个重载都具有一个通用引用。 我想让一个函数调用另一个函数以避免代码重复,但是我不确定哪一种是对另一函数进行通用引用的正确方法。
template <typename U>
void set_value(U&& value) {
this->value_ = std::forward<U>(value);
}
template <typename U>
void set_value(U&& value, int overloaded) {
// which is the correct way to use the other `set_value` overload?
set_value(value); // just use value directly?
set_value(std::forward<U>(value)); // or should I forward it?
}
如果您想完美地传递value
,请使用std::forward
即使value
可能绑定到右值,但在set_value
按名称使用它时,它也是左值。 因此,如果您执行set_value(value);
单参数重载中的通用引用将绑定到左值引用。
我们可以通过添加类似以下内容来确认这一点:
template<class T> class TD; // Allows us to view type deduction results in
// the form of compilation errors.
// (From "Effective Modern C++")
...
template <typename U>
void set_value(U&& value) {
TD<decltype(value)> td;
}
...
int i;
set_value(i, 0);
set_value(3, 0);
使用转发时,这将给您带来编译错误,该错误将显示set_value(i, 0);
int&
value
类型set_value(i, 0);
。 如果注释掉该语句,则会收到set_value(3, 0);
的编译错误set_value(3, 0);
揭示int&&
的value
类型。
如果删除转发,两种情况下都将得到int&
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.