fun*_*con 9 c++ scopeguard exception-safety
到目前为止,每个看过范围守卫都有一个保护布尔变量.例如,请参阅此讨论: 最简单,最新的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;
}
Run Code Online (Sandbox Code Playgroud)
为什么没有临时副本被破坏?依赖这种行为是危险的吗?
您正在观察复制消除(或在本例中为移动消除)的效果。复制消除不是保证/强制的,但通常由主要编译器执行,即使在没有优化的编译时也是如此。尝试 gcc 的 -fno-elide-constructors 来查看它“中断”:http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR
归档时间: |
|
查看次数: |
526 次 |
最近记录: |