C ++析构函数调用返回值的时间

C++ destructor called timing for returned value

考虑如下 C++ 代码:

struct V {
  int s;
  V(int s): s(s) {}
  ~V() { cout << "Destructor\n"; }
};

V f() {
  V x(2);
  return x;
}

int main(){
  V a = f();
  cout << "Function End\n";
  return 0;
}

执行结果显示析构函数只调用了一次

Function End
Destructor

但是,如果我添加如下无意义的 if 语句,析构函数将被调用两次。

V f() {
  if(false) return V(3);
  V x(2);
  return x;
}
Destructor
Function End
Destructor

为什么会这样?有没有避免两次调用析构函数的要点?

在第一个示例中,NRVO命名为 Return 值优化)可能会启动并删除 return x; 中的副本。

当你有两个退出路径,不返回同一个变量时,NRVO 不太可能启动,你实际上会得到一个副本,即使 if(false) 永远不会 true.

下面的内容很可能也会省略副本,因为 x 在通往 return.

的所有路径中返回
V f() {
    V x(2);
    if (false) x = V(3);
    return x;
}