In C++, wo es verfügbar ist, ist es empfehlenswert, auto
für viele Variablen zu verwenden, solche, deren Art insbesondere bekannt, aber ärgerlich tippen:C++ 11 äußere Umfang Variable deklariert Auto
weird_template_type<int,char>::subtype::recursive_subtype some_function() {
// ...
}
// ...
auto val = some_function();
Es ist auch gut, Mikro-Scopes für RAII-Objekte zu verwenden, wenn das sinnvoll ist, z zum Verriegeln:
Gibt es eine Möglichkeit, diese beiden Idiome zu mischen, z.B. Wenn Ihr Shared-Memory-Reading-Code einen seltsamen Typ zurückgibt?
Die offensichtliche Version nicht funktioniert:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Dies ohne initializer aufgrund einer auto
Variable bei der Kompilierung fehlschlägt.
In ähnlicher Weise können Sie die Variable innerhalb des scoped Block nicht erklären, sonst ist es nicht später verfügbar. Die einzigen unmittelbaren Optionen, die ich sehen kann, sind 1. Geben Sie die Variablendeklaration explizit (bleah) aus, oder 2. Verwenden Sie mit einem anderen Ausdruck, von dem Sie wissen, dass er vom selben Typ ist (keine Verbesserung). Gibt es einen anderen Weg?
Vielleicht 'decltype()'? – HolyBlackCat
'auto val = (lock_guard (mut), read_shared_memory()); do_something (val); ' –
cpplearner
ich, dass Sie einen neuen Bereich in der Mitte eines„echten“Raum für Verriegeln Öffnung zeigt ein Designproblem in den meisten Fällen darauf hin will. Sie sollten überlegen, warum Sie das tun – ZivS