gpt4 book ai didi

c++ - vector::push_back 坚持使用复制构造函数,尽管提供了移动构造函数

转载 作者:IT老高 更新时间:2023-10-28 22:11:21 29 4
gpt4 key购买 nike

我从 gcc 收到一个奇怪的错误,不知道为什么。我制作了以下示例代码以使问题更加清晰。基本上,定义了一个类,我将其复制构造函数和复制赋值运算符设为私有(private),以防止意外调用它们。

#include <vector>
#include <cstdio>
using std::vector;

class branch
{
public:
int th;

private:
branch( const branch& other );
const branch& operator=( const branch& other );

public:

branch() : th(0) {}

branch( branch&& other )
{
printf( "called! other.th=%d\n", other.th );
}

const branch& operator=( branch&& other )
{
printf( "called! other.th=%d\n", other.th );
return (*this);
}

};



int main()
{
vector<branch> v;
branch a;
v.push_back( std::move(a) );

return 0;
}

我希望这段代码可以编译,但是 gcc 失败了。实际上 gcc 提示说“branch::branch(const branch&) 是私有(private)的”,据我所知不应该被调用。

赋值运算符有效,因为如果我将 main() 的主体替换为

branch a;
branch b;
b = a;

它将按预期编译和运行。

这是 gcc 的正确行为吗?如果是这样,上面的代码有什么问题?任何建议对我都有帮助。谢谢!

最佳答案

尝试在移动构造函数的声明中添加“noexcept”。

我不能引用标准,但最近版本的 gcc 似乎要求复制构造函数是公共(public)的,或者将移动构造函数声明为“noexcept”。无论“noexcept”限定符如何,如果您将复制构造函数设为公开,它将在运行时按您预期的方式运行。

关于c++ - vector::push_back 坚持使用复制构造函数,尽管提供了移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11488490/

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