假设我有一个类Foo_obj
的初始化对象Foo
,并希望创建一个指向该对象副本的唯一智能指针。代码auto pointer = make_unique<Foo>(Foo_obj)
执行并执行此操作。但是,当在reference中查找std::make_unique
时,这仅接受R值引用作为参数,并使用这些参数调用相应类的构造函数。
我的理解是,诸如Foo_obj
之类的对象是l值,因此上述代码不应编译。我想念什么?
[当您遇到template <typename T> void foo (T&& rt) {...}
之类的东西时,就会发生称为参考碰撞的事情,这就是Meyeres所称的“通用参考”。简而言之,如果传递右值,则将成为右值引用;如果传递左值,则将成为左值引用。这样,函数可以将所有参数完美地转发到unique_ptr
的构造函数。该人自己在this博客中了解有关通用引用的更多信息。