gpt4 book ai didi

c++ - C++ 中的构造函数初始化列表

转载 作者:行者123 更新时间:2023-11-30 01:42:02 26 4
gpt4 key购买 nike

请先看代码如下:

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)中引用的相应知识如下:

We can often, but not always , ignore the distinction between whether a member is initialized or assigned. Members that are const or references must be initialized. Similarly, members that are of a class type that does not define a default constructor also must be initialized

首先我将分享我的想法。“数据”成员在构造函数主体开始执行之前默认初始化。正确的?所以,构造函数中的“数据”成员将复制从函数 make_shared.right 创建的对象?

最佳答案

第一个编译成功,因为你在成员初始化器列表中初始化了 data 并且这种语法在这里完全有效。检查this获取更多信息。

第二个等于data(...)。它不是 data 对象的构造,编译器将其视为对已创建的 data 成员调用 operator() 的尝试(并在错误消息中说明了这一点)。

最后,在 main 函数中,您只需使用 shared_ptr 复制构造函数从返回的 shared_ptr 创建数据 make_shared

关于c++ - C++ 中的构造函数初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40231977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com