我有一些代码涉及迭代这样的std::hash_set
:
typedef std::hash_set< VEdge, VEdge > MyHashSet;
MyHashSet hs;
for( int i=0; i < numFaces; ++i )
{
VEdge myEdge( someValue, someOtherValue );
MyHashSet::iterator it = hs.find(myEdge);
if ( it->face[0] == -1 )
it->face[0] = i; // Error: "Read-only variable is not assignable"
}
我已经改变了代码来简化它,但你可以看看它在做什么。 VEdge
在结构中定义,int face[2]
作为其成员之一。我遇到的问题是Clang告诉我it->face[0]
是只读的,即使这个相同的代码在MSVC上工作(或者我被告知)。有什么关于Clang的意思是我必须以某种方式将face
变量定义为可写的吗?
答案 0 :(得分:7)
hash_set
类是非标准的。 Microsoft的版本允许您通过iterator
修改对象的内容,但SGI的版本是我猜测您与Clang一起使用的版本,iterator
和const_iterator
为相同的类型,意味着您不能通过迭代器修改容器的内容。
同样如此,因为容器中对象的位置由它们的哈希确定,并且它们的哈希值由它们的值确定。更改它们的值需要更改它们的位置,但是哈希集无法检测到您正在更改它们的值,因此容器将不一致。 (也许你正在修改的成员并没有真正影响哈希,但是hash_set
没有办法知道这一点。如果你修改内容,微软的版本可能会留下未定义的行为,而SGI则完全禁止操作。)