分配给数组成员时在 Clang 中"Read-only variable is not assignable"

"Read-only variable is not assignable" in Clang when assigning to an array member

本文关键字:Read-only variable is assignable not Clang 数组 组成员 分配      更新时间:2023-10-16

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

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

这也是一样,

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

相关文章: