2015-08-10 6 views
9

Ogni guardiano dell'oscilloscopio ha una variabile booleana di guardia. Ad esempio, vedere questa discussione: The simplest and neatest c++11 ScopeGuardC++: perché questa semplice Scope Guard funziona?

ma una semplice opere di guardia (gcc 4.9, clang 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; 
} 

Perché non copie temporanee distrutti? È pericoloso fare affidamento su questo comportamento?

+2

Che cosa significa "FINALMENTE"? – Steephen

+9

Stai osservando gli effetti di Copy Elision (o Move Elision, in questo caso). Copia Elision è ** non ** garantita/obbligatoria, ma solitamente eseguita dai principali compilatori anche durante la compilazione senza ottimizzazioni. Prova gcc's '-fno-elide-constructors' per vederlo" break ": http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR – dyp

+0

Grazie, @ dyp. –

risposta

1

Stai osservando gli effetti di Copy Elision (o Move Elision, in questo caso). Copia Elision non è garantito/obbligatorio, ma di solito viene eseguito dai principali compilatori anche durante la compilazione senza ottimizzazioni. Prova gcc's -fno-elide-constructors per vederlo "break": http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR