通用引用和重载

universal references and overloads

本文关键字:重载 引用      更新时间:2023-10-16

>假设我在一个类中有两个方法重载,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(3, 0);显示要int&&value类型。
如果您删除转发,则在这两种情况下都会int&