c++ - 在 Clang++ 的 C++17 中不能禁用 RVO/NRVO?

标签 c++ c++11 c++17

我在使用 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;
}

最佳答案

在 C++17 中,语言定义发生了变化。在您问题的代码中,没有 temporary ,也没有什么可以省略的。

纯右值表达式可以被视为延迟实例化。表达式 auto a = getTempA(100); 根据定义等同于 A a(100);

关于c++ - 在 Clang++ 的 C++17 中不能禁用 RVO/NRVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61743861/

相关文章:

c++ - 在C++上使用QueueAudio时声音播放不起作用

c++ - 类字符串是否总是被初始化为空?

c++ - 如何在整数四面体中找到具有最小可能路径的最大和?

xcode - 项目 header Xcode 11中的Cant访问变量或类型

c++ - 哪些编译器支持 std::filesystem?

c++ - `static_assert` 和构造函数中的顺序或错误

c++ - 获取缩放相对于鼠标产生的偏移量

c++ - 在 vector 上放置背线

c++ - 如何从 std::list 中删除一个元素?

c++ - 为什么 std::allocator::deallocate 不是 noexcept?