Об этом источнике исходный код системы статистического машинного перевода Moses. В Factor
классе Mosesdecoder project, есть это странное использование ключевого слова mutable
:Какое ключевое слово изменено в исходном коде Мозеса?
class Factor {
__SOME_OTHER_CODE__
// FactorCollection writes here.
// This is mutable so the pointer can be changed to pool-backed memory.
mutable StringPiece m_string
size_t m_id;
__SOME_OTHER_CODE__
}
Полный файл Factor.h
является here. Я знаю, что mutable
используется, когда вы хотите изменить вариант-член в функции-член-член или когда вы хотите изменить некоторую переменную вне области видимости в выражении лямбда. Однако я не понимаю, что делает mutable
в этом коде.
Я ценю любой намек. Спасибо.
Благодарим вас за этот быстрый ответ. Эта вещь 'm_string' модифицируется другим классом. Обычно я вижу, что функция-член модифицирует переменную-член, помеченную 'mutable' в том же классе. Вот почему я чувствую себя странно. –
@YuhuanJiang: если это «пул», может быть какой-то менеджер пула, который «достигает», чтобы изменить «m_string»: например - если пул удалил, он мог бы установить 'm_string' пустым или выбросить исключение при следующем доступе. Вы не даете много информации о том, что вы видели, что вы ожидали, и почему разница в замешательстве. –
@YuhuanJiang: Основная цель 'mutable' - разрешить изменение изменяемых полей объекта даже с помощью ссылки или указателя' const'. Это, как правило, безопасно, пока объект остается _логически постоянным. Например, если строка, содержащаяся в 'm_string', не изменяется, не имеет значения, изменится ли внутреннее представление' m_string'. По внешнему виду, 'm_string' оставался постоянным. В этом примере кажется, что некоторый код управления памятью может захотеть переместиться туда, где текст строки сохраняется без изменения этого текста. Это «логически сост.». –