返回转发的引用

Returning a forwarded reference

本文关键字:引用 转发 返回      更新时间:2023-10-16

我想构建一个最大函数,将较大的值转发到结果,保持引用的类型(右值或左值)。

#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);