gpt4 book ai didi

c++ - 默认移动成员定义为删除,当没有定义特殊成员?

转载 作者:搜寻专家 更新时间:2023-10-31 02:01:52 25 4
gpt4 key购买 nike

在 Accu 2014 的演讲中,有一张幻灯片基本上说:

如果用户声明没有特殊的成员函数(构造函数/析构函数/operator=),则“默认移动成员定义为已删除”。幻灯片 21,here .

然而,这个简单的程序会打印出调用了移动函数:

#include <stdio.h>
#include <utility>

struct Foo {
Foo() { printf("Foo()\n"); }
Foo(const Foo &) { printf("Foo(const Foo &)\n"); }
Foo(Foo &&) { printf("Foo(Foo &&)\n"); }
~Foo() { printf("~Foo()\n"); }

Foo &operator=(const Foo &) { printf("Foo::operator=(const Foo &)\n"); return *this; }
Foo &operator=(Foo &&) { printf("Foo::operator=(Foo &&)\n"); return *this; }
};

struct Baz {
Foo f;
};

int main() {
Baz b;
Baz c(std::move(b));

b = Baz();
}

输出:

Foo()
Foo(Foo &&)
Foo()
Foo::operator=(Foo &&)
~Foo()
~Foo()
~Foo()

在程序中,Baz没有任何特殊功能,但似乎调用了移动功能,这违反了幻灯片中的规则,因为移动功能应该被删除。

幻灯片有错吗?我误解了什么吗?标准中是否有关于此的更改(我尝试使用 -std=c++11/14/17 进行编译,结果相同)?

最佳答案

您误读了幻灯片。我将在此处复制该幻灯片的全部文本:

  • “defaulted” can mean “deleted” if the defaulted special member would have to do something illegal, such as call another deleted function.
  • Defaulted move members defined as deleted, actually behave as not declared.
    • No, I’m not kidding!

它说的是什么:“如果默认的特殊成员必须做一些非法的事情,它被定义为已删除。如果一个默认的移动成员被定义为已删除,它实际上表现得好像它不是完全声明。”

您的解释漏掉了加粗的 if。这并不是说移动默认移动成员将始终被删除。它的意思是,如果删除默认移动成员,则认为它根本未声明 (C++11) 或不参与重载决议 (C++14+),这实际上与不存在相同。换句话说,此类类在移动时会默默地退回到复制。

关于c++ - 默认移动成员定义为删除,当没有定义特殊成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318979/

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