为什么从std :: string的initilizer列表中填充std :: vector不会调用std :: string构造函数

时间:2015-12-19 14:55:42

标签: c++ c++11 stdstring

我有以下课程:

class StringContainer {
  public:
    StringContainer(const std::string& s1, const std::string& s2) {  
      string_array_ = {s1, s2};
    }

  std::vector<std::string> string_array_;
};

然后我从这个结构创建一个对象:

StringContainer con(s1, s2);

其中s1和s2是本地定义的非const std :: string变量。 我注意到,初始化列表中string_array_的赋值不会至少调用一次std :: string&#39; s构造函数。 (不适用于初始化程序列表中的临时对象或插入到向量中的对象)。我已经读过,对于简单的可构造类,这可能是可能的,但是简单构造函数的要求之一是具有隐式默认构造函数/复制构造函数。但是std :: string(std :: basic_string)都已定义。我在这里错过了什么? 如果我想编写一个可以使用此优化的字符串类,我该怎么办?

1 个答案:

答案 0 :(得分:1)

我的调试器确信调用了构造函数,但是如果我不能使用调试器,我决定做一些实验来获取证据。你也可以自己尝试一下。

创建std :: string的子类,用string2替换代码中的std :: string,添加一些打印输出并获得构造函数被调用的视觉证据:

class string2 : public string
{
public:
   string2(std::string s) : std::string(s)
   {
      std::cout << "string2 constructor" << std::endl;
   }
   string2(const string2& s) : std::string(s)
   {
      std::cout << "string2 copy constructor" << std::endl;
   }
};