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

标签 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 变量定义为可写的吗?

最佳答案

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

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

关于c++ - 分配给数组成员时 Clang 中的 "Read-only variable is not assignable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12478432/

相关文章:

swift - Cocoapods 0.35 构建失败

java - <identifier> HashSet 上的 add 方法出现预期 Java 编译时错误

javascript - 如何将 C++ 值实时传递给 JS/jQuery?

c++ - bool 运算符,在 C++ 中是否有快捷方式来执行此操作?

clang-format:如果参数不合适,总是会中断?

c++ - Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(同时使用 link.exe 和 lld-link.exe)

c++ - 超过 1GB 的内存分配错误

c++ - 将字符串变量与一组字符串常量进行比较的最佳方法是什么?

java - 如何使用 Struts 嵌套标签库从 HashSet 字段属性中获取项目?

java - HashSet vs ArrayList CPU 使用率高