ben*_*wad 2 c++ readonly clang hashset
我有一些代码涉及迭代这样的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"
}
Run Code Online (Sandbox Code Playgroud)
我已经改变了代码来简化它,但你可以看看它在做什么.VEdge在具有int face[2]其成员之一的结构中定义.我遇到的问题是,Clang告诉我这it->face[0]是只读的,即使这个相同的代码在MSVC上运行(或者我被告知).有没有关于Clang的事情意味着我必须以face某种方式将变量定义为可写的?
这个hash_set班是非标准的.微软的版本允许你通过修改对象的内容iterator,但是SGI的版本,这是我猜你的版本正在与铛使用,拥有iterator和const_iterator视为同一类型,这意味着你不能修改容器的内容通过迭代器.
这也是一样,因为容器中对象的位置由它们的哈希确定,它们的哈希值由它们的值决定.更改它们的值需要更改它们的位置,但是哈希集无法检测到您正在更改它们的值,因此容器将不一致.(也许你正在修改的成员并没有真正影响哈希,但是没有办法hash_set知道这一点.如果你修改内容,微软的版本可能会留下未定义的行为,而SGI则完全禁止操作.)