返回转发的引用

时间:2014-02-22 13:12:52

标签: c++ c++11

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

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

为什么?我正在使用GCC 4.8.2和-std = c ++ 11。

编辑:clang ++不会发生这种情况。

1 个答案:

答案 0 :(得分:3)

由于C ++ 11 5.16 / 4中关于条件运算符的规则,您的原始代码应该可以工作:

  

如果第二个和第三个操作数是相同值类别的glvalues并且具有相同的类型,则结果是该类型和值类别

两个表达式forward<T>(left)forward<T>(right)都是左值或两个x值,因此它们总是glvalues,它们都是T类型,因此规则适用,并且条件表达式的类型应该是相同的类型和值类别。

但是,作为潜在编译器错误的解决方法,您可以使用以下表达式,这可以避免计算条件表达式的类型和值类别(这似乎是错误的位置):

return std::forward<T>(left > right ? left : right);