调用哪个字符串构造函数?

时间:2019-02-03 17:34:32

标签: c++ constructor initialization stdstring string-literals

我知道这是初始化,但是在每种情况下都使用字符串文字时,我很困惑这2个构造函数中的哪个被调用。他们都是复制构造函数吗?

string::string(const string& strString)
string::string(const char *szCString)

案例1:

string sSource("my string");

案例2:

const char *szSource("my string");

1 个答案:

答案 0 :(得分:2)

您可以check what the compiler does(GodBolt.org):

在第一种情况下,被调用的构造函数是:

std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&)

或者,换句话说,如果我们忽略分配器引用参数的默认值,则为:

std::string::string(char const*)

对于第二种情况,没有字符串构造函数被调用。您只会得到:

    mov     QWORD PTR [rbp-8], OFFSET FLAT:.LC0

将指针指向原始字符的位置。

现在,我认为您感到困惑的是字符串文字的语义。 字符串文字不是 std::string !请记住,C ++作为一种语言, not 并没有固有的字符串类型。 std::string来自标准库。

那么字符串文字的类型是什么?这是一个char数组。 See for yourself(Coliru.com;该示例包含用于将类型名称获取为字符串的代码)