2

我有一些涉及迭代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某种方式将变量定义为可写的吗?

4

1 回答 1

7

hash_set类是非标准的。Microsoft 的版本允许您通过 修改对象的内容iterator,但 SGI 的版本,我猜您正在使用 Clang 的版本,具有iteratorconst_iterator作为相同类型,这意味着您不能修改容器的内容通过迭代器。

也一样,因为容器中对象的位置是由它们的哈希值决定的,而它们的哈希值是由它们的值决定的。更改它们的值将需要更改它们的位置,但哈希集无法检测到您正在更改它们的值,因此容器会不一致。(也许您正在修改的成员不会真正影响哈希,但无法hash_set知道这一点。如果您修改内容,Microsoft 的版本可能会留下未定义的行为,而 SGI 则完全禁止该操作。)

于 2012-09-18T14:09:13.123 回答