【发布时间】:2014-02-22 13:12:51
【问题描述】:
我想构建一个最大值函数,将较大的值转发给结果,同时保持引用的类型(右值或左值)。
#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++不会发生这种情况。
【问题讨论】:
-
return std::forward<T>(left > right ? left : right)怎么样? -
你用的是什么编译器?我没有使用 Apple LLVM 5.0 的警告
-
这很奇怪,无论如何 - 你不能真正拥有 多个 参数的通用参考。
-
@kerreksb 当然可以,只是没那么有用!
-
@trion:推导一个参数并强制另一个参数具有相同类型的标准方法是使第二种类型不可推导,如下所示:
template <typename T> void foo(T && a1, typename std::common_type<T>::type a2)现在a1受通用约束参考,a2必须能够匹配。