2015-08-10 12 views
9

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?

+2

Was ist "endgültig"? – Steephen

+9

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

+0

Danke, @dyp. –

Antwort

1

Sie beobachten die Effekte von Copy Elision (oder in diesem Fall Move Elision). Copy Elision ist nicht garantiert/obligatorisch, wird aber in der Regel von größeren Compilern ausgeführt, auch wenn sie ohne Optimierungen kompiliert werden. Versuchen Sie, gcc's-fno-elide-constructors "break" zu sehen: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR