Почему работает std::string{"const char ptr"}?

Я вижу, что std::string имеет только один CTOR с initializer_list: string (initializer_list<char> il); Так что список инициализатора должен работать с символами, верно? Зачем std::string{"some_str"} работает, он получает const char*, право?

1 ответ

Решение

n3337 13.3.1.7/1

Когда объекты неагрегированного класса типа T инициализируются списком (8.5.4), разрешение перегрузки выбирает конструктор в два этапа:

- Первоначально функции-кандидаты являются конструкторами списка инициализаторов (8.5.4) класса T, а список аргументов состоит из списка инициализаторов как единственного аргумента.

- Если жизнеспособный конструктор списка инициализаторов не найден, разрешение перегрузки выполняется снова, где все функции-кандидаты являются конструкторами класса T, а список аргументов состоит из элементов списка инициализатора.

std::string имеет много конструкторов. Один из них, который получает const char*,

Итак, сначала компилятор возьмет initializer_list c-tor в разрешении перегрузки, но он не является подходящим кандидатом, когда string построен с const char*тогда компилятор посмотрит на другие конструкторы и выберет лучший, то есть

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

Вы можете проверить это на простом примере:

#include <initializer_list>
#include <iostream>

class String
{
public:
   String(const std::initializer_list<char>&) { std::cout << "init-list c-tor called" << std::endl; }
   String(const char*) { std::cout << "const char* c-tor called" << std::endl; }
};

int main()
{
   String s{"hello"};
}

Живая версия

Другие вопросы по тегам