Haftungsausschluss: Das ist wird lahm.C++: Art von "solchen Strings". Einen Funktionsaufruf machen wie Spaß ("str") Arbeit
Zwei Fragen:
Der von der Neugier getrieben Teil: Was ist die genaue Art eines Zitat markierten Zeichenfolge? Prevoiusly dachte ich, dass es eine C
char[]
Stringstd::string
umgewandelt, wenn es gebraucht wird, aber einigetype_traits
Experimente zeigten dies:std::is_lvalue_reference<decltype ("string")>::value; -> true std::is_object<std::remove_reference<decltype ("string")>>::value; -> true std::is_same<decltype ("string"), std::string&>::value; -> false
Der lahme Teil: welche Art von Argument sollte mit einer Funktion übernehmen zu können, beschäftigen Anrufe wie
fun("str")
? Der Grund für diese Frage ist, dass das folgende Beispiel nicht kompiliert wegen derstatic_assert
:template <typename T> void fun (const T &what) { static_assert(sizeof(T) < 0, "Something unsupported"); } void fun (std::string str) { std::cout << "Copied" << std::endl; } void fun (const std::string &str) { std::cout << "Lvalue" << std::endl; } void fun (std::string &&str) { std::cout << "Rvalue" << std::endl; } int main() { fun ("str"); //static assertion failed return 0; }
Mehr über, kommentiert die Vorlage verursacht aus
error: call of overloaded 'fun(const char [4])' is ambiguous candidates are: [all three options]
Es ist nicht zweideutig scheint mir. Warum erstellt es keine temporäre Zeichenkette und übergibt sie an rvalue-reference?
Es ist ein Zeiger auf eine Konstante (schreibgeschützt) Null-terminiert (endet mit '\ 0') Array von' Char's. –
@barakmanos Warum zeigten die 'type_traits', dass es sich nicht um einen Zeiger handelt, sondern um einen lvalue-Bezug auf ein Objekt? – Alex
In C++ ist der Typ des String-Literals '" Hello "' 'const char [6]' (ein Array von 6 Elementen vom Typ 'const char'). Das zeigerähnliche Verhalten ist auf die standardmäßige Konvertierung von Array zu Zeiger zurückzuführen. –