【发布时间】:2015-12-20 23:40:51
【问题描述】:
考虑以下 sn-p:
#include <memory>
#include <typeinfo>
#include <iostream>
class Widget {
};
int main() {
auto shared_ptr_to_widget = std::shared_ptr<Widget>({});
std::cout << "type of shared_ptr_to_widget: " << typeid(shared_ptr_to_widget).name() << std::endl;
auto maybe_a_widget = *shared_ptr_to_widget;
std::cout << "type of maybe_a_widget: " << typeid(maybe_a_widget).name() << std::endl;
}
这将输出:
> type of shared_ptr_to_widget: St10shared_ptrI6WidgetE
> type of maybe_a_widget: 6Widget
但是,如果我将 Widget 类替换为:
class Widget {
public:
Widget(): a{1}{}
int a;
};
然后它会在以下行出现故障:
auto maybe_a_widget = *shared_ptr_to_widget;
我知道如果我真的想创建一个指向我应该使用的对象实例的共享指针
std::make_shared<Widget>()
这实际上会调用 Widget 的构造函数,一切都会很好。但我真的很想了解这里发生了什么以及为什么行为会根据 Widget 类的构造函数而改变。
我已经尝试查看 shared_ptr http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr 的构造函数,但我有点迷失了。我想这是我对使用空初始值设定项列表作为 shared_ptr() 的参数时实际发生的情况缺乏了解。
【问题讨论】:
标签: c++