& quot; переменная только для чтения не может быть назначена & quot; в Clang при назначении члена массива

У меня есть код, который включает в себя итерацию через 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 переменная как-то для записи?

2

Решение

hash_set класс нестандартный. Версия Microsoft позволяет изменять содержимое объекта с помощью iterator, но версия SGI, которая, как я предполагаю, вы используете с Clang, имеет iterator а также const_iterator как тот же тип, что означает, что вы не можете изменить содержимое контейнера с помощью итераторов.

Это также хорошо, поскольку позиции объектов в контейнере определяются их хэшами, а их хэш — их значениями. Изменение их значений потребовало бы изменения их позиций, но хэш-набор не может определить, что вы меняете их значения, поэтому контейнер будет несовместимым. (Возможно, элементы, которые вы изменяете, на самом деле не влияют на хэш, но для hash_set знать это. Версия Microsoft, вероятно, оставляет поведение неопределенным, если вы изменяете содержимое, тогда как SGI полностью запрещает эту операцию.)

7

Другие решения

Других решений пока нет …