返回转发的引用
Returning a forwarded reference
我想构建一个最大函数,将较大的值转发到结果,保持引用的类型(右值或左值)。
#include <utility>
template<typename T>
constexpr T&& mmax(T&& left, T&& right) {
return left > right ? std::forward<T>(left) : std::forward<T>(right);
}
int main() {
mmax(1, 2);
}
但是,这给了我
max.cc: In instantiation of 'constexpr T&& mmax(T&&, T&&) [with T = int]':
max.cc:9:14: required from here
max.cc:5:72: warning: returning reference to temporary [-Wreturn-local-addr]
return left > right ? std::forward<T>(left) : std::forward<T>(right);
为什么?我正在使用带有 -std=c++11 的 GCC 4.8.2。
编辑:clang++不会发生这种情况。
您的原始代码应该可以工作,因为 C++ 11 5.16/4 中有关条件运算符的规则:
如果第二个和第三个操作数是相同值类别的 glvalue 并且具有相同的类型,则结果属于该类型和值类别
两个表达式forward<T>(left)
和forward<T>(right)
要么都是左值,要么都是 x值,因此它们始终是 glvalue,并且它们都是 T
类型,因此规则适用,条件表达式的类型应属于相同的类型和值类别。
但是,作为潜在编译器 bug 的解决方法,您可以使用以下表达式,该表达式避免确定条件表达式的类型和值类别(这似乎是错误所在):
return std::forward<T>(left > right ? left : right);
相关文章:
- 正在折叠转发引用
- 如何在模板中转发右值和左值引用
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C++ 何时使用常量引用而不是转发引用
- 为什么转发声明的好友类不能在类中引用?
- C++完美转发:如何避免悬空引用
- C++:通用(转发)引用中不允许常量
- 模板模板参数和转发引用
- 常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
- 具有右值引用,而不是使用可变参数模板转发引用
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 如何从常量引用或通过转发模板临时构造对象
- 结构化绑定和转发引用是否混合良好?
- 如何声明接受转发引用并返回引用或副本的函数模板
- 间接转发引用
- 为什么调用转发引用构造函数而不是复制构造函数?
- 为什么 std::get 没有一个接受转发引用的签名
- 有没有办法在不引用其模板类型的情况下转发声明指向类的指针
- c++重新评估引用转发性能
- 右值引用转发错误