c++17在编译时将带有已删除复制构造函数的类添加到std::vector
c++17 add class with deleted copy constructor to std::vector at compile time
下面是我用已删除的复制构造函数和复制赋值运算符定义的一个类。这是必须作出的唯一假设。
class MyClass
{
public:
explicit MyClass(int i) : i(i) {}
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
MyClass(MyClass&& other) :
i(std::move(other.i))
{}
MyClass& operator=(MyClass&& other) {
i = std::move(other.i);
return *this;
}
private:
int i;
};
目标是在编译时将我的类添加到std::向量中。
int main()
{
std::vector<MyClass> v{MyClass{0}, MyClass{1}, MyClass{2}};
return 0;
}
我的编译器告诉我STL需要使用我删除的副本构造函数MyClass::MyClass(const MyClass&)
,但有什么办法可以解决这个问题吗?
我已经知道在运行时添加值的可能方法,但在我看来,下面的解决方案很糟糕,因为我丢失了编译时检查。
int main()
{
std::vector<MyClass> v;
v.emplace_back(MyClass{0});
v.emplace_back(MyClass{1});
v.emplace_back(MyClass{2});
return 0;
}
我的编译器告诉我STL需要使用我删除的副本构造函数
MyClass::MyClass(const MyClass&)
,但有什么办法可以解决吗?
不,你不能。
initializer_list
为您创建了一个隐藏数组,声明为const
,大致计算如下:
// pseudo code
const MyClass __arr[3] = { MyClass(1), MyClass(2), MyClass(3) };
std::vector<MyClass> v{ std::initializer_list<MyClass>{ __arr, __arr + 2 } };
如果你想避免复制,你必须像你说的那样坚持emplace_back
。
我已经知道在运行时添加值的可能方法。。。
顺便说一下,您的示例是而不是使用emplace_back
:的正确方法
std::vector<MyClass> v;
v.emplace_back(MyClass{0});
v.emplace_back(MyClass{1});
v.emplace_back(MyClass{2});
您仍在创建MyClass
,然后将其移动到v
,这是使用emplace
-ish函数时非常常见的错误。
你真正想做的事情可能如下:
v.reserve(3);
v.emplace_back(0);
v.emplace_back(1);
v.emplace_back(2);
这样可以避免意外地调用move构造函数,并且只在正确的位置构造对象一次,不移动,也不复制。
目标是在编译时将我的类添加到
std::vector
中。
如果要在编译时创建数组,请改用std::array
。std::array
正是为此目的而设计的:
std::array<MyClass, 3> v = { 1, 2, 3 };
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 在 UML 类图中为C++类添加构造函数和析构函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- C++将带有重载构造函数的对象添加到另一个对象
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 创建/向容器添加对象时如何使用构造函数/析构函数
- 如何在构造函数的静态列表中添加对象
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 将参数添加到q_object构造函数
- 将功能添加到默认复制构造函数中
- C++构造函数期间向映射添加"self"
- 使用超载运算符添加构造函数
- 在已发布的结构中添加构造函数(用于 memcpy)是否安全?
- 通过添加构造函数和一些成员函数来扩展 std::(w)字符串
- 修复已添加构造函数的结构的初始化
- 我将如何向该代码添加构造函数
- 向第三方类/结构定义添加构造函数
- 继承std::string类时跳过添加构造函数