gpt4 book ai didi

c++ - C++17 在 MOVE 省略方面发生了什么变化

转载 作者:行者123 更新时间:2023-12-05 03:34:19 24 4
gpt4 key购买 nike

C++17 是否保证“移动省略”?让我解释一下我的意思。在几乎每一篇关于 C++17 介绍的文章中,都可以找到术语:“RVO 的保证复制省略”,这有点不言自明。但是移动构造呢?

让我们看下面的代码,很简单,有一个不可复制的类型和两个函数,一个按值获取 NonCopyable 参数,第二个按右值引用获取。

#include <iostream>

struct NonCopyable
{
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;

NonCopyable(NonCopyable&& other) noexcept
{
std::cout << "Move ctor\n";
}
};

void func_by_value(NonCopyable cp)
{
auto x = std::move(cp);
}

void func_by_rvalue_ref(NonCopyable&& cp)
{
auto x = std::move(cp);
}

int main()
{
std::cout << "Pass by value:\n";
func_by_value(NonCopyable());

std::cout << "\nPass by rvalue_ref\n";
func_by_rvalue_ref(NonCopyable());
}

我使用 GCC(trunk) 使用以下标志编译了两次,结果略有不同。

(1) -O0 -std=c++11 -fno-elide-constructors

Program output: Pass by value:Move ctorMove ctorPass by rvalue_refMove ctor

(2) -O0 -std=c++17 -fno-elide-constructors

Program output:Pass by value:Move ctorPass by rvalue_refMove ctor

所以我的问题是——在使用 C++17 时移动限制被省略了,有什么变化? Compiler explorer

最佳答案

自 C++17 mandatory elision of copy/move operations介绍:

Under the following circumstances, the compilers are required to omit the copy and move construction of class objects, even if the copy/move constructor and the destructor have observable side-effects. The objects are constructed directly into the storage where they would otherwise be copied/moved to. The copy/move constructors need not be present or accessible:

  • ...

  • In the initialization of an object, when the initializer expression isa prvalue of the same class type (ignoring cv-qualification) as thevariable type:

    T x = T(T(f())); // only one call to default constructor of T, to initialize x

在纯右值NonCopyable() 的参数cp 的初始化中,需要省略move 构造。请注意,强制复制省略适用于复制操作和移动操作。

关于c++ - C++17 在 MOVE 省略方面发生了什么变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70185398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com