[英]C++: why this simple Scope Guard works?
到目前為止,每個看過范圍守衛都有一個保護布爾變量。 例如,請參閱此討論: 最簡單,最新的c ++ 11 ScopeGuard
但是一個簡單的守衛工作(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;
}
為什么沒有臨時副本被破壞? 依賴這種行為是危險的嗎?
您正在觀察Copy Elision(或移動Elision,在本例中)的效果。 復制Elision不是保證/強制性的,但通常由主要編譯器執行,即使在編譯w / o優化時也是如此。 試試gcc的-fno-elide-constructors,看看它“破解”: http : //melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.