繁体   English   中英

通用引用和重载

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM