struct Foo{};
std::make_unique<Foo>
和std::make_unique<std::reference_wrapper<Foo>>
有什么区别?
答案 0 :(得分:2)
std::make_unique<Foo>
返回
std::unique_ptr<Foo>
。
std::make_unique<std::reference_wrapper<Foo>>
返回
std::unique_ptr<std::reference_wrapper<Foo>>
。
std::reference_wrapper
是普通指针上的非所有者包装。导致std::unique_ptr
拥有std::reference_wrapper<Foo>
,而该实体不拥有它所指的Foo
。
std::unique_ptr<std::reference_wrapper<Foo>>
等效于std::unque_ptr<Foo*>
,其中Foo*
被销毁,而Foo
被销毁。随之而来的是很容易引入内存泄漏,从而破坏了std::unique_ptr
的目的。
答案 1 :(得分:2)
Foo
根据传递的所有参数创建一个具有动态存储持续时间的std::make_unique<Foo>(args...)
。当且仅当Foo(args...)
也有效时,std::make_unique<std::reference_wrapper<Foo>>
是有效的表达式。
std::reference_wrapper<Foo>
使用另一个std::reference_wrapper<Foo>
或将绑定到Foo &
但不绑定Foo &&
的东西创建一个具有动态存储持续时间的Foo
。它不会创建任何其他Foo
,您需要至少一个std::unique_ptr<std::reference_wrapper<Foo>>
才能存在。
我想不出有充分的理由在gsl::observer<Foo>
(又名Foo *
),std::reference_wrapper<Foo>
或std::unique_ptr<Foo>
上使用 private void InsertByDapper(string className, SqlConnection conn)
{
Type type = Type.GetType(className);
if (type != null)
{
var instance = Activator.CreateInstance(type);
// ... update some properties in the instance object...
conn.Insert(instance);
//connTo.Insert((ClassName)instance); //This statment works
}
}
,具体取决于你想做什么。
答案 2 :(得分:1)
std::make_unique<std::reference_wrapper<Foo>>
返回一个拥有的智能指针,该指针指向对Foo
的引用。
对Foo
的引用是在堆上分配的。
从未创建实际的Foo
。
出于同样的原因,它将无法编译:
auto x = std::make_unique<std::reference_wrapper<Foo>>();
结果:
error: 'std::reference_wrapper<Foo>': no appropriate default constructor available
使其生效的唯一方法是使它引用一些预先存在的Foo
:
Foo foo;
auto x = std::make_unique<std::reference_wrapper<Foo>>(foo);
无法想到一个有效的用例。