我非常支持让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中?
答案 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!
因此,问题的其他两部分:
和