Какой строковый конструктор вызывается? - PullRequest
0 голосов
/ 03 февраля 2019

Я знаю, что это инициализация, но я запутался, какой из 2 конструкторов вызывается, когда строковый литерал используется в каждом случае.Оба они являются конструкторами копирования?

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

Case1:

string sSource("my string");

Case2:

const char *szSource("my string");

1 Ответ

0 голосов
/ 03 февраля 2019

Вы можете просто проверить, что делает компилятор (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; в примере есть код для получения имен типов в виде строк)

...