Unterschied Referenz auf const, const Referenz und const Referenz auf const
-
Was ist eigentlich der Unterschied zwischen einer Referenz auf const, einer const Referenz und einer const Referenz auf const?
void machWas(const std::string& text) { .... } void machWasAnderes(std::string& const text) { .... } void machNochWasAnderes(const std::string& const text) { .... }
-
Das eine ist eine konstante Referenz auf etwas, das nächste eine Referenz auf ein konstantes etwas und das letzte eine konstante Referenz auf ein konstantes etwas.
//edit: mit anderen Worten: Die Frage ist reichlich besch ... eiden.
//edihidit: eine konstante Referenz ist sowieso sinnfrei.
-
Das dachte ich mir auch, denn Referenzen sind doch eh immer konstant, sonst wäre es ja Zeiger, oder bin ich da auf dem Holzweg?
-
Eine Referenz kann einmal initialisiert nicht auf ein anderes Objekt verweisen.
-
Wie eine Konstante, die kann auch nur einmal initialisiert werden und bleibt dann so.
-
@CppConst sagte in Unterschied Referenz auf const, const Referenz und const Referenz auf const:
void machNochWasAnderes(const std::string& const text) { .... }
Wenn du das in einen Compiler fütterst, wirst du merken dass es nichtmal kompiliert.
-
@hustbaer huch?
-
@Swordfish Wie, huch?
Das sind halt die Regeln, ich mache die nicht.
Eine Referenz ist implizitconst
, und daher istT& const
halt verboten.GCC mit -std=c++17
<source>:1:15: error: 'const' qualifiers cannot be applied to 'int&' 1 | void fun(int& const); | ^~~~~ Compiler returned: 1
Clang mit -std=c++17
<source>:1:15: error: 'const' qualifier may not be applied to a reference void fun(int& const); ^
MSVC mit -std:c++17
<source>(1): warning C4227: anachronism used: qualifiers on reference are ignored
Erlaubt ist das ganze natürlich in Templates, wenn die Referenz bereits in einem Template-Parameter "enthalten" ist:
template <class T> struct make_const_1 { using type = T const; }; template <class T> using make_const_2 = T const; void fun1(typename make_const_1<int&>::type); void fun2(make_const_2<int&>);
-
https://eel.is/c++draft/dcl.ref#1
Cv-qualified references are ill-formed [...]
Wow. Tatsächlich. Schon arg daß der cl das schluckt.
-
Ja. Hab's jetzt noch mit
/permissive-
probiert, und sogar da schluckt er es.
Naja gut, gibt glaube ich schlimmeres.
-
Danke für Hilfe hier. Ich hatte dieses doppel const bei Referenzen zuerst in Visual Studio eingegeben, es gab keinen Fehler und daraufhin habe ich meine Frage hier rein gestellt.
-
@CppConst Wenn du auch keine Warnung bekommen hast, solltest du den Warning-Level deines Projekts umstellen.