Jeder Blick auf den Schutzumfang hat bisher eine Boolesche Variable. Zum Beispiel finden Sie in dieser Diskussion: The simplest and neatest c++11 ScopeGuardC++: Warum funktioniert dieser einfache Scope Guard?
Aber eine einfache Wache Werke (gcc 4.9, Klirren 3.6.0):
template <class C>
struct finally_t : public C {
finally_t(C&& c): C(c) {}
~finally_t() { (*this)(); }
};
template <class C>
static finally_t<C> finally_create(C&& c) {
return std::forward<C>(c);
}
#define FINCAT_(a, b) a ## b
#define FINCAT(a, b) FINCAT_(a, b)
#define FINALLY(...) auto FINCAT(FINALY_, __LINE__) = \
finally_create([=](){ __VA_ARGS__ })
int main() {
int a = 1;
FINALLY(std::cout << "hello" << a << std::endl ;);
FINALLY(std::cout << "world" << a << std::endl ;);
return 0;
}
Warum keine temporären Kopien zerstört? Ist es gefährlich, sich auf dieses Verhalten zu verlassen?
Was ist "endgültig"? – Steephen
Sie beobachten die Effekte von Copy Elision (oder in diesem Fall Move Elision). Copy Elision ist ** nicht ** garantiert/verpflichtend, wird aber in der Regel auch von größeren Compilern ausgeführt, auch wenn sie ohne Optimierungen kompiliert werden. Versuchen Sie die '' fno-elide-constructors '' von gcc, um sie "kaputt" zu sehen: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR – dyp
Danke, @dyp. –