【问题标题】:vector of const pointers? [duplicate]常量指针的向量? [复制]
【发布时间】:2015-03-31 21:03:40
【问题描述】:

以下内容无法编译(非常冗长的错误,但基本上是“不能重载”和“从 'const void*' 到 'void*' 的无效转换”)。我可以理解为什么 push_back() 可能无法编译,因为您无法复制/移动到 Foo* const,但为什么不能编译:

#include <vector>
using namespace std;

class Foo;

int main()
{
  vector<Foo* const> vec;
}

【问题讨论】:

  • 完整错误可以找到here
  • 在 C++03 中,向量元素必须是 CopyAssignable。在 C++11 中它仍然是不允许的,see here。事实上,如果每个人都同意,我建议关闭该问题的副本。
  • 您认为如何在vector 中插入新元素?
  • 我希望存在使用强制转换的解决方案。不懂语言禁止这样做。

标签: c++ pointers vector constants


【解决方案1】:

向量可能是唯一需要元素为copy assignable 的容器。这是因为元素保证连续存储在内存中。因此,如果超出容量,则必须分配一个新块并重新分配元素。你不能用const 元素做到这一点。

如果您尝试std::vector&lt;const int&gt;,或者实际上是任何const 类型,则会出现同样的错误。

【讨论】:

  • 为什么重新分配需要赋值?听起来更像是需要可复制性...
  • @KerrekSB:从编译器分配和可复制性的角度来看,归结为同一件事。
  • 不是任何 const 限定类型;当赋值运算符为 const 时,它应该可以工作。
  • @vsoftco 简单:T const&amp; operator=(T const&amp;) const { … }.
  • @райтфолд 我知道如何声明。看起来像,但我很难理解你如何在不修改向量的“胆量”的情况下实现它,也许将成员声明为mutable....
【解决方案2】:

您正在声明一个包含 Foo 的 const 指针的向量,这意味着无法修改该指针。当您在向量中插入一个元素时,需要写入一个const pointer(无效)。

您确定它不是:std::vector&lt;Foo const *&gt; vec; 其中 Foo 不会被指针修改。

【讨论】:

    【解决方案3】:

    向量元素需要为许多操作赋值:如果你在向量中间插入一个元素,所有后面的元素都必须重新赋值。 const 限定的类型通常是不可赋值的。

    如果您不执行需要赋值的操作,您仍然可以使用不可赋值类型的向量。

    但是,当T 是非常量对象类型时,您只能使用std::allocator&lt;T&gt;,因此std::vector&lt;const int&gt; 的格式不正确。

    【讨论】:

    • 由于 C++11 向量元素不需要可赋值
    • @MattMcNabb:完全正确,已编辑。
    • @MattMcNabb hmmmm,g++4.9.2 甚至 gcc5 都不相信,但是是的,你是对的
    • @KerrekSB 好的;但是根据this question 仍然不允许使用该向量
    • 在你的最后一句话中,“如果你不执行需要赋值的操作,你仍然可以使用不可赋值类型的向量”,这不适用吗?我没有给vec分配任何东西。
    【解决方案4】:

    C/C++ const 关键字是左关联的,即它会影响其左侧的标记,除非const 是语句中的第一个标记。所以void *const 的意思是“指向 void 的常量(=不可变)指针”。

    因此语义是:

    int a;
    void * const ptr = (void*)&a; /* legal */
    
    int b;
    ptr = (void*)&b; /* not permitted */
    

    后者是非法的,因为 const 变量必须在定义时初始化并且以后不能更改。

    在编写std::vector&lt;void * const&gt; 时,您要求编译器将模板实例化为指向void 的不可变指针向量。不管不可变意味着什么,它只能在定义时分配,但它不符合std::vector 的动态特性。

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2017-06-12
      • 2021-06-19
      • 2021-04-19
      • 2020-03-25
      相关资源
      最近更新 更多