2017-02-07 2 views
0

Я пытаюсь понять, как оператор присваивания знает, какой тип данных имеет правая сторона оператора назначения.Каков тип правой части оператора присваивания (строка)?

string x = "foo" 

Это подписи, которые я нашел в файле строки XCode Clang.

basic_string& operator=(const basic_string& str); 
basic_string& operator=(basic_string&& str) 
    noexcept(
     allocator_type::propagate_on_container_move_assignment::value && 
     is_nothrow_move_assignable<allocator_type>::value); 
basic_string& operator=(const value_type* s); 
basic_string& operator=(value_type c); 
basic_string& operator=(initializer_list<value_type>); 

Какой из них вызывается?

Любое объяснение оценено!

+6

'string x =" foo "' использует конструктор, а не оператор присваивания. – PaulMcKenzie

+0

@PaulMcKenzie: Если вы посмотрите внутри класса 'string', мы обнаруживаем, что это шаблонный класс, который перегружает оператор' = 'следующим образом:' basic_string & operator = (const E * s); 'Where' s 'является указателем на общий тип. – Raindrop7

+3

@ Raindrop7 Если код был 'string x; x = "foo"; ', тогда оператор присваивания вступает в игру. Однако 'string x =" foo ";' is construction, а не присвоение. – PaulMcKenzie

ответ

2

Правая рука имеет тип const char[4], а конструктор

string(const char* s, const Allocator& alloc = Allocator()); 

называется, с распадом const char[4] к const char*. См. http://en.cppreference.com/w/cpp/string/basic_string/basic_string для получения полного списка конструкторов.

Обратите внимание, что инициализация в форме T x = i; всегда вызывает конструктор, а не оператор присваивания. Конструктор дает объекту свое начальное значение, тогда как оператор присваивания заменяет значение, уже существующее в объекте.

+0

Где определено Allocator? – user1767754

+0

@ user1767754 Это один из параметров шаблона 'std :: basic_string'. В случае 'std :: string' используется значение по умолчанию' std :: allocator '. – Brian

+0

Спасибо, Брайан, извините за беспокойство, я просто не смог получить минимальный пример Running. Можете ли вы написать минимальный пример, где вы можете показать, что этот конструктор работает, когда задана строка x = «123»? – user1767754

Смежные вопросы