Innerhalb eines Algorithmus Geben, möchte ich eine Lambda schaffen, die ein Element durch Verweis auf const akzeptiert:ein Element zu einem Lambda durch Verweis auf const
template<typename Iterator>
void solve_world_hunger(Iterator it)
{
auto lambda = [](const decltype(*it)& x){
auto y = x; // this should work
x = x; // this should fail
};
}
Der Compiler nicht mag diesen Code :
Error: »const«-qualifier cannot be applied to »int&« (translated manually from German)
Dann erkannte ich, dass decltype(*it)
bereits eine Referenz ist, und natürlich werden diejenigen nicht const
gemacht. Wenn ich die const
entferne, kompiliert der Code, aber ich möchte x = x
fehlschlagen.
Lassen Sie uns dem Programmierer (der mich ist) für eine Minute vertrauen und die const
und die explizite &
loswerden, die sowieso aufgrund der kollabierenden Referenzregeln gelöscht wird. Aber warte, ist decltype(*it)
eigentlich garantiert eine Referenz zu sein, oder sollte ich die explizite &
auf der sicheren Seite hinzufügen?
Wenn wir den Programmierer nicht vertrauen, kann ich glaube, zwei Lösungen das Problem zu lösen:
(const typename std::remove_reference<decltype(*it)>::type& x)
(const typename std::iterator_traits<Iterator>::value_type& x)
Sie können selbst entscheiden, welche hässlicher ist. Im Idealfall möchte ich eine Lösung, die keine Template-Metaprogrammierung beinhaltet, weil meine Zielgruppe noch nie davon gehört hat. Also:
Frage 1: Ist decltype(*it)&
immer das gleiche wie decltype(*it)
?
Frage 2: Wie kann ich ein Element durch Referenz-zu-Const ohne Vorlage Meta-Programmierung übergeben?
Ein englischer Fehler wäre nett! :) – Pubby
@Pubby Ich versuchte mein Bestes, fühle mich frei zu korrigieren :) – fredoverflow
@sehe die Frage ist nicht über Top-Level const. –