请有人解释为什么以下代码无法使用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。
答案 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的移动赋值运算符抛出异常,否则无效。