RVO/NRVO 不能在 Clang++ 的 C++17 中禁用吗?
RVO/NRVO can not be disabled in C++17 in Clang++?
我从使用 Clang++ 在不同C++版本下运行的同一代码片段中得到了不同的结果。当我使用 C++17 编译代码时,编译器似乎自动调用了 RVO/NRVO,好奇这是一个错误还是不同的功能?
苹果 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 中,语言定义发生了变化。在你问题的代码中,没有临时的,也没有什么可以省略的。
prvalue 表达式可以被视为具有延迟实例化。表达式auto a = getTempA(100);
根据定义与A a(100);
相同。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何在c++17中制作一个模板包装器/装饰器
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- C++17中的并行执行策略
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 并行用于C++17中数组索引范围内的循环
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在C++17中,引用const字符串的语义应该是什么
- 为什么这种直接初始化有效?(C++17)
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 为什么 C++17 中没有 std::construct_at?
- 如何在 Mac 上使用 c++17 并行标准库算法?
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 字符转换功能 std::isupper() & std::islower() C++17
- C++17 文件系统::remove_all 带有通配符路径
- 如何在 C++17 STL 并行算法中处理调度?
- RVO/NRVO 不能在 Clang++ 的 C++17 中禁用吗?