【发布时间】:2017-03-07 00:44:51
【问题描述】:
请先看以下代码:
class StrBlob
{
public:
StrBlob();
// ....
private:
std::shared_ptr<std::vector<std::string> > data;
}
//initializer empty into data ;
StrBlob::StrBlob()
// : data(std::make_shared<std::vector<std::string> >()) // compile success
{
// data(std::make_shared<std::vector<std::string> >()); // compile error
}
int main()
{
// this statement can compile
std::shared_ptr<std::vector<std::string> >data(std::make_shared<std::vector<std::string> >());
return 0;
}
我想知道为什么上面的语句编译会出现错误? ?
error: no match for call to ‘(std::shared_ptr<std::vector<std::__cxx11::basic_string<char> > >)
(std::shared_ptr<std::vector<std::__cxx11::basic_string<char> > >)’
data(std::make_shared<std::vector<std::string> >());
C++Primer 5th (Chapter 7.5)中引用的相应知识如下:
我们可以经常(但并非总是)忽略成员是初始化还是分配之间的区别。必须初始化 const 或引用的成员。类似地,未定义默认构造函数的类类型的成员也必须初始化
首先我将分享我的想法。“数据”成员在构造函数开始执行之前默认初始化。正确的?那么,构造函数中的“数据”成员将复制从函数 make_shared.right 创建的对象?
【问题讨论】:
-
因为你不能在构造函数的主体内构造/初始化对象。它只允许在初始化列表中。不过,您可以 assign 到主体内已构建的对象。
-
“虽然你可以赋值给body内部已经构建好的对象”但是你不应该在c++代码中养成习惯。
标签: c++ c++11 initializer