2015-11-16 1 views
1

Похоже, что в C++ единственный способ иметь строковые литералы полностью в статической памяти это объявить их как:Почему в STL нет конструктора строковых выражений?

class A 
{ 
    static const char const * = "Hello World"; 
}; 

Я заметил, что станд :: строка не имеет постоянное выражение конструктора , Я знаю станд :: строка реализация основана на динамического распределения, но почему нет другой строки класс, совместимый с станд :: струнной, который может сделать работу?

+7

Является ['std :: experimental :: string_view'] (http://en.cppreference.com/w/cpp/experimental/basic_string_view) что вы ищете? – TartanLlama

+1

В следующий раз, пожалуйста, скомпилируйте свой код перед отправкой .... –

+0

@TartanLlama да, действительно, спасибо. Имя string_view не помогло вывести их из игры. Вы знаете, запланирован ли этот экспериментальный класс для C++ 17? – nyarlathotep108

ответ

4

Возможно, вы ищете std::experimental::string_view, что обеспечивает доступ к стандартным строковым строкам и C-образным строкам единым, эффективным образом.

Это часть Library Fundamentals TS, которая была опубликована и может быть внесена в C++ 17.

+4

К сожалению, в то время как 'constexpr string_view :: string_view (const char *)' is 'constexpr', он вызывает' char_traits :: length', который не является 'constexpr', поэтому он все равно не будет работать. Например, 'static const constexpr std :: experimental :: string_view sv (« Hello, world »);' не будет компилироваться. Хотя я не согласен, другие члены комитета сказали мне, что это работает так, как было разработано. – Nevin

+0

@Nevin Как это может работать? Если я хорошо помню, подпрограмма constexpr может вызывать только другие подпрограммы constexpr ... – nyarlathotep108

+0

@ nyarlathotep108 Мне сообщили constexpr в конструкторе basic_string_view , на данный момент, только для тех людей, которые используют свои собственные вместо std :: char_traits, а не для пользователей string_view, wstring_view, u16string_view и u32string_view, во многом аналогично тому, как пара имеет конструкторы constexpr. Для записи я не согласен с этой позицией. Во всяком случае, [LWG 2232] (http://cplusplus.github.io/LWG/lwg-active.html#2232) подробно описывает, почему это нелегко решить для char_traits . – Nevin