我们有一个广泛使用参数的代码库,因为每个函数都可能因一些错误枚举而失败。这变得非常混乱,代码有时不可读。
我想消除这种模式并带来更现代的方法。
目标是改造:
error_t fn(param_t *out) {
//filling 'out'
}
param_t param;
error_t err = fn(¶m);
变成类似的东西:
std::expected<error_t, param_t> fn() {
param_t ret;
//filling 'ret'
return ret;
}
auto& [err, param] = fn();
以下问题是为了让我自己和其他人相信这种改变是最好的:
- 我知道在标准级别上,NRVO 不是强制性的(与 c++17 中的 RVO 不同),但实际上有没有可能在任何主要编译器中都不会发生?
- 使用 out 参数代替 NRVO 有什么好处吗?
- 假设 NRVO 发生,生成的程序集是否有显着变化(假设一个优化的
expected
实现 [也许用布尔值表示是否发生错误完全消失])?