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

标签 c++

请参阅下面的代码 - 我正在尝试将 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/

相关文章:

c++ - 如何结合模板偏特化和模板参数推导

c++ - 用 C++ 快速实现反不完全 Beta 函数

C++ : Nested Switch Case

c++ - 在被调用函数中更改函数指针(std::function)是否安全?

c++ - Xcode 链接器错误 Cocos2d-x Box2D CContactListener 构造函数未定义

c++ - 为什么编译器不会拒绝以加法运算符开头的行?

c++ - 异步、安全地使用 C++11 lambda

java - 用于自定义库的 JNA

c++ - 如何分配引用链的末端?

c++ - 如何在 doxygen 中记录生成的构造函数