c – 如何在RR获得其值的try-block之外提供rValue引用?

假设我们不想重新设计函数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块中.

点赞