2015-08-10 2 views
9

Каждый взгляд на охрану области действия до сих пор имеет защитную логическую переменную. Например, см это обсуждение: The simplest and neatest c++11 ScopeGuardC++: почему этот простой инструмент Scope Guard работает?

а простой охранник работ (GCC 4.9, лязг 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; 
} 

Почему не разрушенное производственное временные копии? Опасно ли полагаться на это поведение?

+2

Что такое 'FINALLY'? – Steephen

+9

Вы наблюдаете эффекты копирования Elision (или Move Elision, в данном случае). Копия Elision ** не гарантирована/обязательна, но обычно выполняется крупными компиляторами даже при компиляции без оптимизации. Попробуйте gcc '-fno-elide-constructors', чтобы увидеть его« break »: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR – dyp

+0

Спасибо, @dyp. –

ответ

1

Вы наблюдаете эффекты копирования Elision (или Move Elision, в данном случае). Копирование Elision не гарантируется/обязательна, но обычно выполняется крупными компиляторами даже при компиляции без оптимизаций. Попробуйте gcc -fno-elide-constructors, чтобы увидеть его «break»: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR

Смежные вопросы