Я задавался вопросом о последнем конструкторе для std::string
упомянутый здесь. Это говорит:
template string (InputIterator begin, InputIterator end);
Если InputIterator
целочисленный тип, ведет себя, поскольку шестая версия конструктора (одно право выше этого) преобразованием типа начинается и заканчивается для вызова его:
string(static_cast(begin),static_cast(end));
В любом другом случае параметры взяты в качестве итераторов, и содержание инициализируется со значениями элементов, которые идут от элемента, отнесенного итератором, начинаются к элементу прямо перед тем, отнесенным к концу итератора.
Таким образом, что это означает если InputIterator
a char *
?
Править: Хорошо, мое плохое. Я просто понял, что это говорит, что целочисленный тип, не тип примитива в документации, таким образом, вопрос не относится к тому примеру. Но тем не менее, примитивы указателей?
В C++ нет понятия "примитивных" типов; целые числа являются фундаментальными типами, а указатели - составными типами.
В данном случае char*
не может быть преобразован ни в size_t
, ни в char
, поэтому он будет взят в качестве параметра шаблона InputIterator
.
Указатели C ++ довольно хорошо реализуют концепцию InputIterator (в конце концов, итераторы STL являются обобщением указателей C ++). Таким образом, два аргумента рассматриваются как указатели на массив символов, обозначающих первый и «один прошедший конец» элементы, необходимые для инициализации строки.
char * str = "Some string";
std::string s(str, str+6); // s = "Some s";