【问题标题】:Is NRVO valid with exception throwing in body?NRVO 在正文中抛出异常是否有效?
【发布时间】:2019-07-20 04:36:51
【问题描述】:

我希望了解 NRVO 在 C++ 中的局限性。即使函数 myFunc() 具有抛出潜力,是否会针对 NRVO 和省略 T val 优化具有初始命名声明和单个返回的函数?

T myFunc(bool toThrow) {
    T val;

    if (toThrow) {
        throw std::exception();
    }

    // Do other things here.

    return val;
}

【问题讨论】:

  • 你试过了吗?编译器是否使用了 NRVO?如果是这样,那么它可能可以。
  • 我想这取决于T 究竟是什么。
  • @Zereges 我会想到同样的事情,但我找不到让 Clang not 使用 NRVO,即使对于在构造函数和析构函数中都有副作用的类型也是如此。

标签: c++ copy-elision nrvo


【解决方案1】:

我在C++ InsightsCompiler Explorer 上测试了您的几个版本的代码。

简短的回答是肯定的,编译器很可能会使用 NRVO。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多