调用哪个字符串构造函数

Which string constructor is invoked?

本文关键字:构造函数 字符串 调用      更新时间:2023-10-16

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

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

案例1:

string sSource("my string");

案例2:

const char *szSource("my string");

你可以检查编译器做了什么(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++作为一种语言没有固有的字符串类型; std::string来自标准库。

那么字符串文字的类型是什么?这是一个字符数组。亲自查看(Coliru.com;该示例包含用于以字符串形式获取类型名称的代码(