Şimdiye kadar kapsam korumasına bakıldığında, bir koruma boole değişkeni var. The simplest and neatest c++11 ScopeGuardC++: Neden bu basit Kapsam Muhafızı çalışıyor?
Ama basit bir nöbet çalışırken (gcc 4.9, çınlama 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;
}
hiçbir geçici kopya tahrip Neden Örneğin, bu tartışmaya bakınız? Bu davranışa güvenmek tehlikeli midir?
'FINALLY' nedir? – Steephen
Kopya Elision (veya bu durumda Move Elision) efektlerini gözlemliyorsunuz. Elision Kopyala **, ** garantili/zorunlu değildir, ancak genellikle optimizasyonları derlerken bile büyük derleyiciler tarafından gerçekleştirilir. Gcc'in "fno-elide-constructors" ı "break" ı görmek için deneyin: http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR – dyp
Teşekkür ederim, @dyp. –