2016-03-01 4 views
3

Я пытаюсь построить строку в C++, как показано ниже.Какой конструктор std :: string вызывается здесь?

const char *cstring = "abcd"; 
const string cppstr = string(cstring, cstring + strlen(cstring)); 

Это работает отлично и cppstr имеет значение «ABCD», даже если она не совпадает ни с одной из строк конструкторов, указанных в стандарте. Может кто-нибудь, пожалуйста, дайте мне знать, какой конструктор строки вызывается в этом конкретном случае.

ответ

5

Существует шаблонный конструктор, который принимает в качестве входных данных два InputIterators. (См. the cppreference.org reference, constructor (6)). Raw C++ указатели отвечают всем требованиям InputIterators (на самом деле они являются RandomAccessIterators). Поэтому вызов

string(cstring, cstring + strlen(cstring) 

вызывает этот конструктор. Этот конструктор работает путем итерации по диапазону элементов, обозначенных итератором, и построения строки в виде копии этих элементов.

Как примечание, вы можете просто написать

const string cppstr{cstring, cstring + strlen(cstring)}; 

здесь вместо назначения cppstr значение.

+0

Или даже просто 'const string cppstr {cstring};' – rici

+0

@rici: если я использую const string cppstr (cstring), созданная строка будет содержать в ней '\ 0'. – kadina

+0

@kadina Уверены ли вы в этом? Конструктор предназначен для остановки, как только он набирает нулевой ограничитель. – templatetypedef

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