Raw-String-Literale und Dateikodierung

C ++ 11 stellte dierohe String-Literale Das kann sehr nützlich sein, um Strings in Anführungszeichen, Literale mit vielen speziellen Symbolen wie Windows-Dateipfade, Regex-Ausdrücke usw. darzustellen.

std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";

Diese rohen String-Literale können auch mit Kodierungspräfixen kombiniert werden (u8, u, U, oderL), aber wenn kein Codierungspräfix angegeben ist, spielt die Dateicodierung eine Rolle? Nehmen wir an, ich habe folgenden Code:

auto message = R"(Pick up a card)";         // raw string 1
auto cards = R"()"; // raw string 2

Wenn ich den obigen Code schreiben und speichern kann, ist es offensichtlich, dass mein Quellcode als Unicode codiert ist, also frage ich mich:

Dasraw string 1 wäre ein Unicode-Literal? (obwohl es nur ASCII-Zeichen verwendet), mit anderen Worten, übernimmt die Rohzeichenfolge die Codierung der Datei, in die geschrieben wird, oder der Compiler erkennt automatisch, dass Unicode unabhängig von der Dateicodierung nicht benötigt wird.Wäre das Kodierungspräfix nötigU auf derraw string 2 Um es als Unicode-Literal zu behandeln oder wäre es aufgrund seines Inhalts und / oder der Codierung der Quelldatei automatisch Unicode?

Danke für Ihre Aufmerksamkeit.

BEARBEITEN:

Testen Sie den obigen Code in ideone.com und drucken Sie den entwirrten Typ vonmessage undcards Variablen, gibt es auschar 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;
}

Ausgabe:

message type: char const*

cards type: char const*

Das ist sogar komisch, als ich dachte, ich war überzeugt, dass der Typ sein würdewchar_t (auch ohne dieL Präfix).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage