Просматривая черновик C++14/C++1y (n3690), я заметил введение basic_string
литеральных суффиксов в разделе §21.7:
inline namespace literals {
inline namespace string_literals {
// 21.7, suffix for basic_string literals:
string operator "" s(const char *str, size_t len);
u16string operator "" s(const char16_t *str, size_t len);
u32string operator "" s(const char32_t *str, size_t len);
wstring operator "" s(const wchar_t *str, size_t len);
}
}
Мои вопросы:
- Есть ли возможность быть быстрее во время выполнения с литералами
basic_string
? - Моя «наивная» реализация совершенно неверна?
- Может ли расположение данных в ПЗУ отличаться литералами
basic_string
или какие-либо другие различия во время компиляции и во время выполнения?
Фон
Я знаю, что это позволяет напрямую использовать такие строковые литералы:
std::string s1 = "A fabulous string"s;
void sfunc(std::string arg);
int main() {
sfunc("argument"s);
}
Но в чем преимущество этого перед использованием конструктора преобразования string(const char*)
?
«Старый» код будет выглядеть так:
std::string s1 = "A fabulous string"; // c'tor string(const char*)
void sfunc(std::string arg);
int main() {
sfunc("argument"); // auto-conversion via same c'tor
}
Насколько я вижу, реализация operator "" s()
в основном будет выглядеть так:
std::string operator "" s(const char* lit, size_t sz) {
return std::string(lit, sz);
}
Итак, просто использование того же c'tor. И я предполагаю, что это должно быть сделано во время выполнения, я ошибаюсь?
Редактировать: Как правильно указал Никол Болас ниже, в моем примере не используется тот же конструктор, а конструктор с дополнительной длиной, который равен очень полезно для строительства, очевидно. Это оставляет у меня вопрос: лучше ли для компилятора помещать строковые литералы в ПЗУ или что-то подобное во время компиляции?