gpt4 book ai didi

c++ - 给出编译错误的 const 对象的 vector

转载 作者:IT老高 更新时间:2023-10-28 12:36:08 25 4
gpt4 key购买 nike

我在我的代码中声明了以下内容

vector <const A> mylist; 

我得到以下编译错误 -

new_allocator.h:75: error: `const _Tp* __gnu_cxx::new_allocator<_Tp>::address(const _Tp&) const \[with _Tp = const A]' and `_Tp* __gnu_cxx::new_allocator<_Tp>::address(_Tp&) const [with _Tp = const A]' cannot be overloaded

但如果声明 -

vector <A> mylist;

我的代码编译了。

在这种情况下不允许使用 const 吗?

我在这里复制我的代码供大家引用 -

#include <iostream>
#include <vector>

using namespace std;
class A
{
public:
A () {cout << "default constructor\n";}
A (int i): m(i) {cout << "non-default constructor\n";}

private:
int m;
};

int main (void)
{
vector<const A> mylist;

mylist.push_back(1);

return 0;
}

最佳答案

vector 中的项目必须是可分配的(或者,在标准的更新版本中,是可移动的)。 const 对象是不可分配的,因此尝试将它们存储在 vector 中会失败(或至少 can 失败 - 代码无效,但编译器可以自由无论如何都接受它,如果它愿意的话,尽管大多数程序员通常更愿意拒绝无效代码)。

我想对于真正的迂腐的人来说,如果你想的不够好,你可以定义一个可赋值的类型,尽管它是 const,像这样:

class ugly { 
mutable int x;
public:
ugly const &operator=(ugly const &u) const {
x = u.x;
return *this;
}
};

我相信您应该能够将这种类型的项目存储在 vector 中,即使它们是 const。使用 VC++ 创建这些 vector 的快速测试成功。这在一些较旧的编译器上失败了(例如,在 g++ 4.8.1 上失败了),但适用于最近的编译器(VC++ 至少回到 2015 年,g++ 至少回到 5.4,clang++ 至少回到 4.0——尽管我没有t 试图追踪每个支持它的第一个版本)。

对于当前的编译器,支持移动 const 对象的类型可能也可以正常工作。但是,以防它不明显:这允许你修改一个对象,即使它被标记为 const。这显然直接违反了任何合理的用户期望,所以这主要是一个问题,而不是解决方案。

关于c++ - 给出编译错误的 const 对象的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17313062/

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