NRVO 在抛出异常时有效吗?

Is NRVO valid with exception throwing in body?

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

T myFunc(bool toThrow) {
    T val;

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

    // Do other things here.

    return val;
}

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

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