到目前为止,每个查看的作用域防护都有一个防护布尔变量。例如,请参阅此讨论:最简单、最简洁的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;
}
为什么没有销毁临时副本?依赖这种行为有危险吗?
您正在观察复制消除(或在本例中为移动消除)的效果。复制消除不是保证/强制的,但通常由主要编译器执行,即使在没有优化的编译时也是如此。尝试 gcc 的 -fno-elide-constructors 来查看它“中断”:http://melpon.org/wandbox/permlink/B73EuYYKGYFMnJtR
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)