无法在Clang ++中的C ++ 17中禁用RVO / NRVO?

问题描述 投票:0回答:1

我从使用Clang ++在不同C ++版本下运行的同一代码段获得了不同的结果。当我使用C ++ 17编译代码时,似乎编译器已自动调用RVO / NRVO,好奇是错误还是其他功能?

Apple clang版本11.0.0(clang-1100.0.33.17)

使用以下命令在C ++ 11]下运行:

clang ++ test.cc -fno-elide-constructors -std = c ++ 11 -o test

结果:

Move Constructor
Move Constructor
100

使用以下命令在C ++ 17]下运行:

clang ++ test.cc -fno-elide-constructors -std = c ++ 17 -o test

结果:

100

代码(test.cc):

struct A {
  A() = default;
  A(int v) : p(new int(v)) {}
  ~A() { delete p; }
  A(const A&) = delete;
  A& operator=(const A&) = delete;
  A(A&& rhs) noexcept : p(rhs.p) { 
    std::cout << "Move Constructor" << std::endl; 
    rhs.p = nullptr; 
  }
  A& operator=(A&& rhs) noexcept {
    std::cout << "Move Operator" << std::endl;
    p = rhs.p; 
    rhs.p = nullptr; 
    return *this; 
  }
  int getPV() const { return *p; }
 private:
  int* p;
};
A getTempA(int v) { return A(v); }
int main(int argc, char** argv) {
  auto a = getTempA(100);
  std::cout << a.getPV() << std::endl;
  return 0;
}

我从使用Clang ++在不同C ++版本下运行的同一代码段获得了不同的结果。当我编译...

c++ c++11 c++17
1个回答
0
投票
时,似乎编译器已自动调用RVO / NRVO。

在C ++ 17中,语言定义已更改。在您所质疑的代码中没有临时的内容,也没有任何遗漏。

prvalue表达式可被视为具有延迟的实例化。根据定义,表达式auto a = getTempA(100);A a(100);相同。

© www.soinside.com 2019 - 2024. All rights reserved.