gpt4 book ai didi

c++ - 容器内的 'const' 值实际上是不允许的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:58 25 4
gpt4 key购买 nike

为什么我不能将具有 const 值的结构放入像 std::vector 这样的容器中? (我理解编译器报告的技术原因,我只是不确定编译器/集合是否应该这样做)

例如,一些非常简单的东西:

struct sample {
int const a;
};
std::vector<sample> v;
v.push_back( sample{12} );

这给出了关于使用已删除的 operator= 的错误(至少在 GCC 中)。但我不明白为什么它应该使用 operator=。构造此 vector 时不需要使用复制运算符。如果它不使用复制构造函数一个就地新的,这是完全允许的。例如,以下是可以的:

sample a;
new (&a) sample{12};

调用sample 的析构函数也可以。也就是说,在这种类型上有足够的允许操作来构造一个 vector ,但我无法这样做。我认为具有右值和移动语义的 C++11 在这里也可能有所帮助,但也许我错了。

标准的哪一部分明确不允许这样做,或者确实是编译器错误(不太可能)?

最佳答案

我对标准 (N3290) 的阅读表明您的 push_back已验证。

23.2.3 第 16 段(表 101 — 可选序列容器操作)说 push_back只需要 T它是MoveInsertable .

23.2.1 第 13 段定义了 MoveInsertable : 以下表达式应有效: allocator_traits<A>::construct(m, p, v);

20.6.8.2 第 5 段指定默认情况下(例如,对于默认分配器)construct调用 placement new -- 很像你的期望。

问候,&rzej

关于c++ - 容器内的 'const' 值实际上是不允许的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16623598/

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