std :: shared_ptr <t>:r值指向T </t>的隐式构造函数

时间:2014-09-26 07:58:11

标签: c++ c++11 shared-ptr rvalue

我非常支持让std::shared_ptr<T>构造函数明确接受T *的想法。当你正在查看堆损坏的原因时,它有助于挽救不眠之夜。 Scott Meyers 为此做了很好的解释。


但是......如果我给它一个rvalue指针不明白吗?我可以这样做:

/// (1)
std::shared_ptr<T> t = new T;

/// (2)
T * giveaway = new T;
std::shared_ptr<T> t = std::move(giveaway);

或现实生活中更痛苦的案例

/// (3)
void foo(std::shared_ptr<T> t);
/// ...
foo(new T);

至于我,所有这些案例都足够明确。

案例(1)是一个prvalue,我不可能搞砸两个指针。至少不过是使用:

std::shared_ptr<T> t{new T};

案例(2)非常明确。一致同意,在你移动了某些东西后,它的值变得不确定。所以使用它完全取决于你。

案例(3)再次为rvalue


(Q1)这是标准委员会的俯视吗?

(Q2)这是否有原因?

(Q3)隐式构造函数是否有机会接受rvalue出现在C ++ 14中?

1 个答案:

答案 0 :(得分:8)

甚至给出一个rvalue的原因还不允许从原始指针隐式构造智能指针:

这不安全。

void foo(std::shared_ptr<T> t);
char buffer[42];
foo(buffer+7); // buffer+7 is a rvalue, and would implicitly convert!

因此,问题的其他两部分:

  1. 这不是委员会的疏忽。
    1. 它不会出现在未来的C ++标准中(无论如何,C ++ 14已经出局且没有出现)。