gpt4 book ai didi

c++ - std::move( ) 在没有 move-ctor 的情况下调用 copy-ctor。为什么以及如何预防?

转载 作者:可可西里 更新时间:2023-11-01 18:28:20 24 4
gpt4 key购买 nike

我想知道是否有一种安全编程实践可以在这种微妙的行为发生时提醒编码人员,或者更好的是,首先避免这种行为。

struct A 的用户可能没有意识到没有 move 构造函数。在他们尝试调用不存在的 ctor 时,他们既没有收到编译器警告,也没有收到任何运行时指示调用了复制 ctor。

下面的答案解释了发生的转换,但我看不出这是一件好事的任何理由。如果缺少以const 引用 作为参数的构造函数,则会出现编译时错误,而不仅仅是解析为非常量引用 版本。那么,当类中没有实现 move 语义时,为什么尝试使用 move 语义不会导致编译时错误?

有没有办法通过一些编译时选项避免这种行为,或者至少有一种在运行时检测它的方法?

在 move 之后可以断言(source is null)如果他们预料到了这个问题,但很多问题都是如此。

例子,当:

struct A {
A() {...}
A(A &a) {...}
A(A const & A) {...}
};

构造如下:

A a1;
A a2 = std::move(a1); //calls const copy (but how would I know?)

这会导致调用复制构造函数的 const 版本。现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数。

最佳答案

因为 std::move 返回一个右值,它可以转换为一个 const ref,这就是复制构造函数被静默调用的原因。您可以通过多种方式解决此问题。

  1. 简单的方法,如果您的类没有动态分配,只需像这样使用默认的 mctor。
    A(A &&) = 默认;
  2. 摆脱 cctor 中的 const,这可能不是一个好主意,但它不会比

  3. 只是实现自己的 move 构造函数,为什么要 move 到一个没有 mctor 的对象


这有点偏离主题,但您也可以像这样限定成员函数仅使用可修改的左值。

int func()&;

如果您正在处理遗留代码,这里是编译时检查 move constructable

关于c++ - std::move( ) 在没有 move-ctor 的情况下调用 copy-ctor。为什么以及如何预防?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264168/

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