gpt4 book ai didi

c++ - 为什么不能将 const 对象放入 STL 容器中?

转载 作者:可可西里 更新时间:2023-11-01 17:47:03 27 4
gpt4 key购买 nike

请参阅下面的代码 - 我正在尝试将 const 对象放入 vector 中。我知道答案是“STL 容器要求对象是可分配的和可复制构造的”,但是,在不引用标准的情况下,任何人都可以解释这样做的问题是什么?我不明白为什么不能复制这样的类(除了 c++ 不允许)。

它只是一个存储的值,不允许更改 - 为什么不能将它放在一个 vector 中,简单地创建另一个这些对象?

#include <vector>

// Attempt 1
// /home/doriad/Test/Test.cxx:3:8: error: non-static const member ‘const int MyClass::x’, can’t use default assignment operator

// struct MyClass
// {
// int const x;
// MyClass(int x): x(x) {}
// };
//
// int main()
// {
// std::vector<MyClass> vec;
// vec.push_back(MyClass(3));
// return 0;
// }

// Attempt 2
// /home/doriad/Test/Test.cxx:28:23: error: assignment of read-only member ‘MyClass::x’
struct MyClass
{
int const x;
MyClass(int x): x(x) {}
MyClass& operator= (const MyClass& other)
{
if (this != &other)
{
this->x = other.x;
}

return *this;
}
};

int main()
{
std::vector<MyClass> vec;
vec.push_back(MyClass(3));
return 0;
}

编辑:

用 std::set 和 std::list 可以做到这一点。我猜是 std::vector 中的 sort() 函数使用了赋值。这不是 UB 对吧?

#include <set>

// Attempt 1
struct MyClass
{
int const x;
MyClass(int x): x(x) {}
bool operator< (const MyClass &other) const;
};

bool MyClass::operator<(const MyClass &other) const
{
if(this->x < other.x)
{
return true;
}
else if (other.x < this->x)
{
return false;
}

}


int main()
{
std::set<MyClass> container;
container.insert(MyClass(3));
return 0;
}

最佳答案

EDIT2:(删除了一堆不需要工作的东西)C++11 标准声明 insert 方法用于 vector deque(以及 push_back 的默认实现)要求值类型为 CopyAssignable,即该值支持:

t= v;

默认情况下,具有 const 成员的类和结构不是 CopyAssignable,因此您想要执行的操作将不起作用。

本文档 (n3173)对各种容器要求进行了解释。

关于c++ - 为什么不能将 const 对象放入 STL 容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685257/

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