Необработанные строковые литералы и кодификация файлов
C ++ 11 представилнеобработанные строковые литералы что может быть очень полезно для представления строк в кавычках, литералов с множеством специальных символов, таких как пути к файлам Windows, выражения регулярных выражений и т. д.
std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";
Эти необработанные строковые литералы также можно комбинировать с префиксами кодирования (u8
, u
, U
, или жеL
), но, если префикс кодирования не указан, имеет ли значение кодировка файла?, давайте предположим, что у меня есть этот код:
auto message = R"(Pick up a card)"; // raw string 1
auto cards = R"()"; // raw string 2
Если я смогу написать и сохранить приведенный выше код, очевидно, что мой исходный код закодирован как Unicode, поэтому мне интересно:
raw string 1
будет ли Unicode буквальным? (хотя он использует только символы ASCII), другими словами, наследует ли необработанная строка кодификацию файла, в котором написано, или компилятор автоматически обнаруживает, что unicode не нужен независимо от кодировки файла?Нужен был бы префикс кодировкиU
наraw string 2
для того, чтобы рассматривать его как литерал Юникода, или он будет автоматически в Юникоде из-за его содержимого и / или кодировки исходного файла?Спасибо за внимание.
РЕДАКТИРОВАТЬ:
Тестирование приведенного выше кода на ideone.com и распечаткаmessage
а такжеcards
переменные, это выводитchar const*
:
template<typename T> std::string demangle(T t)
{
int status;
char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
std::string result(name);
free(name);
return result;
}
int main()
{
auto message = R"(Pick up a card)";
auto cards = R"()";
std::cout
<< "message type: " << demangle(message) << '\n'
<< "cards type: " << demangle(cards) << '\n';
return 0;
}
Выход:
message type: char const*
cards type: char const*
что даже более странно, чем я думал, я был уверен, что тип будетwchar_t
(даже безL
префикс).