我正在使用lambdas初始化一些const
变量,如核心c ++准则here中所述。简而言之,这个成语看起来像这样
const auto a = [&]() {
MyType a;
// complex initialization
return a;
}();
当初始化可能引发只能在lambda之外处理的异常时,就会出现问题,例如,因为它必须使函数提前返回。我希望能够做类似这样的事情
try {
const auto a = [&]() {
MyType a;
// complex initialization
return a;
}();
}
catch { /* doesn't matter what */ } {
// Somehow handle it
// then return or throw
}
// use a
除了我希望对象在不引发异常的情况下在try-catch块之后可用。
我可以重构该函数,以便所有依赖于对象的成功初始化的代码都在try
块内,但这会随着多个对象的初始化而急剧扩展。
try {
const auto a = ...;
try {
const auto b = ...;
try...
catch...
}
catch {...} {
...;
}
catch {...} {
...;
}
另一方面,将try-catch块移入lambda内会限制我可以做的处理。例如,据我所知,它不允许我立即return
,break
或continue
。几乎感觉上逻辑上的解决方案似乎是将分配与try块(例如const auto a = try [&]()...
)交织在一起,但是似乎不被这种支持所支持。我是否正确,因为不支持此操作?如果是,是否存在另一个已知习语会导致我需要的行为?
注意:我要求的情况是变量为const
很重要,或者不可能进行默认构造并不能赋值,因此在try块之外并在内部分配值的默认构造的明显解决方案这是不可行的。