通用引用和重载
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(3, 0);
显示要int&&
的value
类型。
如果您删除转发,则在这两种情况下都会int&
。
相关文章:
- 取消引用运算符不能重载
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 传递空初始值设定项列表时使用右值和左值引用候选项的重载解析
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- C++编程:运算符重载中的引用如何工作?
- 重载运算符*以获取对另一个类的实例的引用
- 对运算符=使用通用引用,而不是多个重载
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 具有参数包和通用引用的重载选择
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C++:对函子重载调用运算符的未定义引用
- 运算符重载C++类中的引用返回
- 错误:无法解析对重载函数的引用
- 两个相同的重载运算符[]一个返回引用
- 在函数重载中将右值引用实现为参数
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 运算符重载C++引用或值
- C++类模板构造函数 -- 重载引用 (U&) 与数组 (U*) 失败
- C++ 类运算符重载引用
- 重载引用与const引用