【发布时间】:2019-06-21 15:34:02
【问题描述】:
所以我想练习std::forward 的用法,并创建了一个带有2 个构造函数的Test 类。 1 个带有T&,另一个带有T&& 过载。 T& 打印 lvalue,T&& 打印 rvalue 所以我知道使用了哪个构造函数。我在堆栈上创建了 2 个类实例,令我惊讶的是,它们都使用了 T&& 重载。
#include <iostream>
#include <type_traits>
#include <utility>
template <class T> auto forward(T &&t) {
if constexpr (std::is_lvalue_reference<T>::value) {
return t;
}
return std::move(t);
}
template <class T> class Test {
public:
Test(T &) { std::cout << "lvalue" << std::endl; };
Test(T &&) { std::cout << "rvalue" << std::endl; };
};
int main() {
int x = 5;
Test<int> a(forward(3));
Test<int> b(forward(x));
return 0;
}
我尝试使用原始的 std::forward 函数并实现它,但两次都打印了 rvalue x2。我做错了什么?
【问题讨论】:
-
auto绝不是参考。
标签: c++ forward rvalue lvalue stdmove