【问题标题】:Why I'm allowed to assign a new address to a vector containing constant pointers?为什么允许我为包含常量指针的向量分配新地址?
【发布时间】:2010-08-18 21:12:52
【问题描述】:

我认为标题清楚地解释了我的问题....考虑以下 sn-p:

class Critter {
    int m_Age;
};

int main()
{
    vector<Critter* const> critters;
    for(int i = 0; i < 10; ++i)
        critters.push_back(new Critter());

    critters[2] = new Critter();

    return 0;
}

critters[2] = new Critter();这行不应该是非法的吗?

谢谢

【问题讨论】:

  • 这就是为什么提供可编译的例子是个好主意。您提供的代码无法编译(即使在添加 #include 并将向量放入 std::vector 之后)。所以要么你做的事情与我们预期的略有不同,要么你没有剪切和粘贴代码(或两者兼而有之)
  • 它确实可以用 MSVC 编译。实现错误?
  • 据我所知,如果您在容器中使用的类型违反了它必须满足的约束,标准中没有任何要求诊断错误。鉴于此,我认为您只会得到未定义的行为,因此如果它编译,并不意味着它是一个实现错误。

标签: c++ pointers vector constants


【解决方案1】:

其实这条线应该是非法的(即使给出#include &lt;vector&gt;using std::vector;):

vector<Critter* const> critters;

因为在容器中使用的类型必须是可分配的,而 const 显然不是。

【讨论】:

    【解决方案2】:

    抱歉,我没有发布整个代码,因为缺少的只是包含和使用...无论如何,这里是整个代码:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Critter {
        int m_Age;
    };
    
    int main()
    {
        vector<Critter* const> critters;
        for(int i = 0; i < 10; ++i)
            critters.push_back(new Critter());
    
        critters[2] = new Critter();
    
        return 0;
    }
    

    即使在 VS 2010 中没有警告,这段代码也可以正常编译... 再次感谢...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多