【发布时间】:2015-08-10 17:17:41
【问题描述】:
让我们问一下这个简单的范围保护:
template <class T>
struct finop_t {
T& t;
~finop_t() { t(); }
};
#define FINALLY__(l, cl) \
auto FIN ## l ## clo = cl; \
finop_t<decltype(FIN ## l ## clo)> FIN ## l ## fin { FIN ## l ## clo}
#define FINALLY_(l, cl) FINALLY__(l, cl)
#define FINALLY(...) FINALLY_(__LINE__, ([=](){__VA_ARGS__}))
int main() {
FINALLY( std::cout << "hello" << std::endl ; );
std::cout << "one" << std::endl;
FINALLY( std::cout << "world" << std::endl ; );
std::cout << "second" << std::endl;
return 0;
}
在这里依靠销毁命令安全吗?即假设 ~finop_t() 将在 lambda 析构函数之前被调用是否安全?
【问题讨论】:
-
这可以编译吗?您正在为可变左值引用分配一个临时值。
-
它会编译。首先,我用闭包值初始化变量
FIN##l##clo。 (也许,复制省略在这里有点帮助)。然后将FIN##l##clo的引用分配给变量FIN##l##fin的字段t。 -
啊,我明白了。在那种情况下,为什么不存储对象并直接初始化它呢?复制省略将确保没有多余的副本,并且您不会通过引用进行间接访问
-
如果你告诉我怎么做,我会很高兴的。我还没有找到更简单的方法来对抗模板参数推导。
-
好吧,我制作了依赖复制省略的简单版本stackoverflow.com/questions/31922693/…
标签: c++ exception-safety scopeguard