【发布时间】:2022-01-15 02:49:24
【问题描述】:
我想使用不可复制、不可移动类的非默认构造函数来构造向量。使用默认构造函数它工作正常,我可以构造一个向量,只要我不调整它的大小。但不知何故,使用非默认构造函数似乎必须复制。有谁知道我是否可以在构造过程中使用非默认构造函数避免复制操作,以便我可以继续使用向量?
#include <vector>
#include <mutex>
class A {
public:
A(int num) : vec(num) {}
private:
std::vector<std::mutex> vec;
};
class B {
public:
B(int numB, int numA) : vec(numB, numA) {}
private:
std::vector<A> vec;
};
int main() {
B b(2, 3);
return 0;
}
当我尝试编译时,我得到:
/usr/include/c++/9/bits/stl_uninitialized.h:127:72: error: static assertion failed: result type must be constructible from value type of input range
【问题讨论】:
-
“构造一个非嵌套向量工作正常” 这是值得怀疑的。也许您设法创建了一个默认构造向量,但您将无法向其中插入任何内容。
std::vector与不可移动类型不兼容。 -
您可以使用将 unique_ptr 存储到不可复制和不可移动对象的向量。
-
@user17732522 重新打开。
-
这个问题的一个细微差别是,当您调用
vec(numB, numA)时,实际上是通过A的单参数构造函数将numA转换为A(numA),该构造函数未标记为@ 987654329@.