Почему работает 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"};
}