分配给数组成员时,Clang中的“只读变量不可分配”

时间:2012-09-18 13:52:28

标签: c++ clang hashset readonly

我有一些代码涉及迭代这样的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变量定义为可写的吗?

1 个答案:

答案 0 :(得分:7)

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

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