【发布时间】:2015-08-21 01:42:57
【问题描述】:
我最近开始学习 C++。我对带有左值引用和右值引用的 std::forward 有疑问。 据我了解,以下代码中的 Func(mc) 假设调用 Func(T&t) 因为模板参数推导规则。 MyClass 的复制构造函数应该在函数内部调用,并带有一条消息“复制构造函数”。但是,当我运行程序时,我无法得到它。 我检查了带有右值引用和复制构造函数的 std::forwad 在其他行中运行良好。 请帮助我理解代码中发生的事情。如果我犯了容易的错误或误解,我很抱歉占用您的时间。非常感谢。
class MyClass {
public:
MyClass() { printf("constructor.\n"); };
MyClass(MyClass&) { printf("copy constructor.\n"); };
MyClass(const MyClass&) { printf("const copy constructor.\n"); };
MyClass(MyClass&&) { printf("move constructor.\n"); };
int val = 3;
};
template <typename T>
void Func(T&& t) {
T new_t_(std::forward<T>(t));
new_t_.val *= 2;
};
main() {
MyClass mc;
Func(mc); // lvalue <- Func(T&)
Func(MyClass()); // rsvalue <- Func(T&&)
printf("mc.val=%d\n", mc.val); // this is for check
MyClass mc2(mc); // this is for check of copy constructor
}
运行程序时的输出如下,
constructor.
constructor.
move constructor.
mc.val=6
copy constructor.
我认为它应该在第一个和第二个“构造函数”消息之间有“复制构造函数”。
再次非常感谢您。
【问题讨论】:
-
MyClass(MyClass&)构造函数对许多类来说不是很有用。对于 RAII 模式,通常只遵循Rule Of Five。 -
谢谢你。我用 MyClass(MyClass&) 来检查这个复制构造函数没有被调用而不是 MyClass(const MyClass&) 虽然现在我知道在 Func() 中都没有调用。
标签: c++ templates c++11 perfect-forwarding