我想构建一个最大函数,将较大的值转发给结果,保持引用的类型(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 ++不会发生这种情况。
答案 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);