我明白:
shared_ptr<X> x = make_shared<X>();
比:
shared_ptr<X> x(new X());
我了解这些优势。但是,我不明白为什么编译器不能有这样的规则
“如果我
new()
在同一行看到shared_ptr
声明,请使用make_shared
”
那么是什么阻止编译器自动使用make_shared
并要求我们指定它呢?
我明白:
shared_ptr<X> x = make_shared<X>();
比:
shared_ptr<X> x(new X());
我了解这些优势。但是,我不明白为什么编译器不能有这样的规则
“如果我
new()
在同一行看到shared_ptr
声明,请使用make_shared
”
那么是什么阻止编译器自动使用make_shared
并要求我们指定它呢?
可能可以做到,但是添加另一个特殊规则只是为了节省打字是无效的,也不是 c++ 的哲学,如果有人想出一个更好的 shared_ptr 怎么办,如果 std::shared_ptr 是一个模板,那么就做一个 better_shared模板,你就完成了。如果它进入核心语言,尽管它永远存在。
另请注意,它不会节省太多打字:
auto x = make_shared<X>()
对比shared_ptr<X> x(new X())
它也比“如果我看到new()
并且共享指针然后使用make_shared
”更复杂,因为make_shared
只替换了 shared_ptr 构造函数的 13 个(我认为)重载之一。这些规则无疑是标准中已经足够大的页面。只需使用make_shared
,然后您就不需要额外的规则。