与const std :: string

时间:2015-04-27 15:02:34

标签: c++ c++11 iterator stdvector

请有人解释为什么以下代码无法使用clang 3.5进行编译。

报告的错误是'算法中没有可行的重载'='。

std::vector<const std::string> m_messages;
std::vector<const std::string>::iterator iter;
...

if (iter != m_messages.end())
{
    m_messages.erase(iter);      // compilation error
}

如果我将m_messages声明为:std::vector<std::string> m_messages;,那么它就会编译好。

另外,有什么区别:

std::vector<const std::string> m_messages;

std::vector<std::string> m_messages;

TIA。

2 个答案:

答案 0 :(得分:16)

要删除元素,必须重新定位右侧元素(向左移动)。

由于您的字符串为const,因此无法覆盖旧元素(通过=运算符),从而导致错误。

答案 1 :(得分:5)

这是否意味着如果可以删除元素,那么使用const字符串向量是没有意义的? Yes at least what the standard says

23.3.7.5向量修饰符[vector.modifiers]

  

迭代器擦除(const_iterator位置);迭代器擦除(const_iterator   首先,const_iterator最后);

     

效果:在擦除点或之后使迭代器和引用无效。

     

复杂性:T的析构函数被称为等于被擦除元素数的次数,但T的移动赋值运算符被称为等于元素数的次数在删除元素后的向量中。

     

引发:除非复制构造函数,移动构造函数,赋值运算符或T的移动赋值运算符抛出异常,否则无效。