【发布时间】:2016-12-10 15:23:31
【问题描述】:
考虑下面的简单程序,它尝试使用对其中元素的 NON-const 引用来迭代集合的值:
#include <set>
#include <iostream>
class Int
{
public:
Int(int value) : value_(value) {}
int value() const { return value_; }
bool operator<(const Int& other) const { return value_ < other.value(); }
private:
int value_;
};
int
main(int argc, char** argv) {
std::set<Int> ints;
ints.insert(10);
for (Int& i : ints) {
std::cout << i.value() << std::endl;
}
return 0;
}
编译时,我从 gcc 收到错误:
test.c: In function ‘int main(int, char**)’:
test.c:18:18: error: invalid initialization of reference of type ‘Int&’ from expression of type ‘const Int’
for (Int& i : ints) {
^
是的,我知道我实际上并没有尝试修改 for 循环中的元素。但关键是我应该能够获得一个非常量引用以在循环内使用,因为集合本身不是 const 限定的。如果我创建一个 setter 函数并在循环中使用它,我会得到同样的错误。
【问题讨论】:
-
如果你真的想修改一个
std::set的元素,在原地,你可以使用const_cast。只需真正确定修改不会改变集合中元素的顺序,否则您将遇到未定义的行为。这是非常不安全的,这就是为什么你必须方式不顾一切地去做。