假设我们不想重新设计函数a_func_that_may_throw.
try {
T&& rr = a_func_that_may_throw();
}
catch (const std::exception& e) {
/* Deal with the exception here. */
}
// Question: How to adapt the code above so as to have `rr` available here?
很抱歉没问清楚我的问题.添加以下内容(希望)使问题更加清晰.
我们可以这样做指针:
T *ptr = nullptr;
try {
ptr = a_source_that_may_throw();
}
catch (const std::exception& e) {
/* We know what happened in the try block and can do something without `ptr`. */
}
// `ptr` is available out side the try block.
从C11开始,我们在工具架上有了rValue参考,这使我们无法有效地复制现有(可能是设计糟糕的)函数返回的大型对象.是否有可能享受这两个优点,所以我们不必复制并仍然可以像上面的代码中使用ptr一样访问返回的对象?
谢谢. m(_ _)m
最佳答案 如果你使用r值引用的原因是你想要一个非const引用绑定到临时,那么恕我直言就好了.而是使用值语义并让编译器进行优化.
T t;
try {
t = a_func_that_may_throw(); // Compiler can use RVO and move assign to 't'.
} catch (const std::exception& e) {
/* Deal with the exception here. */
}
// 't' has lifetime until end of scope.
如果T不是默认可构造或可移动分配,则例外.
或者,如评论中的@Kerrek SB所述,即将所有内容移动到try块中.