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