我有以下课程:
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)都已定义。我在这里错过了什么? 如果我想编写一个可以使用此优化的字符串类,我该怎么办?
答案 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;
}
};