gpt4 book ai didi

c++ - 无法在 C++17 中构造包含 const int 和不可复制(但可移动)对象的对

转载 作者:行者123 更新时间:2023-11-28 01:27:16 24 4
gpt4 key购买 nike

我有一个类,我将其称为 NonCopyable,它不能被复制,但可以移动(移动构造和移动赋值)。我正在尝试构建一个 std::pair<const int, NonCopyable> , 但下面的行不会编译。

std::pair<const int, NonCopyable>(1, NonCopyable());

我收到的错误是:

no matching function for call to 'std::pair<const int, NonCopyable>::pair(int, NonCopyable)'

为什么该行编译失败?由于 NonCopyable 是移动可构造/可分配的,我希望它使用构造函数 template<class U1, class U2> constexpr pair(U1&& x, U2&& y) .

编辑:

所以我遗漏了一些我认为不相关但实际上非常重要的信息。

我有一个类 ContainsNC,它包含一个不可复制的类 NonCopyable。我正在尝试构建一个 std::pair<const int, ContainsNC> , 但下面的代码无法编译。

#include <utility>
#include <thread>
#include <iostream>
struct NonCopyable {
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
NonCopyable(NonCopyable&&) = default;
NonCopyable& operator=(const NonCopyable&) = delete;
NonCopyable& operator=(NonCopyable&&) = default;
};

class ContainsNC {
public:
~ContainsNC() {
std::cout << "destruct" << std::endl;
}
private:
NonCopyable nc;
};

int main() {
std::pair<const int, ContainsNC>(1, ContainsNC());
}

现在,如果 ContainsNC 的自定义析构函数被注释掉,代码就会编译。为什么自定义析构函数会影响 std::pair<const int, ContainsNC> 的构造?

最佳答案

有一条规则说定义析构函数时,移动操作将被删除,编译器默认不会生成它们。

所以你必须在你的类中添加移动构造函数。

class ContainsNC {
public:
~ContainsNC() {
std::cout << "destruct" << std::endl;
}

ContainsNC(ContainsNC&&) = default;
private:
NonCopyable nc;
};

添加move ctor后,默认构造函数被删除,你必须也提供它来编译你的代码:

class ContainsNC {
public:
~ContainsNC() {
std::cout << "destruct" << std::endl;
}
ContainsNC() = default;
ContainsNC(ContainsNC&&) = default;
private:
NonCopyable nc;
};

可以查看this link查看编译器何时为类默认生成移动操作。

关于c++ - 无法在 C++17 中构造包含 const int 和不可复制(但可移动)对象的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197746/

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