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。
我想了解 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。