В чем разница между неизменяемыми и константными функциями-членами?
Справочник по языку программирования D показывает два примера в разделе " Объявления" и "Спецификаторы типов ", поэтому возможны оба варианта:
struct S
{
int method() const
{
//const stuff
}
}
struct S
{
int method() immutable
{
//immutable stuff
}
}
Из документов:
Const-функции - это функции, которым не разрешено изменять какую-либо часть объекта через эту ссылку функции-члена.
А также:
Неизменяемым функциям-членам гарантируется, что объект и все, на что ссылается ссылка, является неизменным.
Я нашел этот вопрос, но все ответы касаются типов данных, а не классов хранения. То же самое касается D const FAQ, хотя это интересное чтение.
Так в чем же разница между двумя определениями выше? Есть ли выражения, которые могут заменить //const stuff
и быть законным, но не //immutable stuff
?
1 ответ
immutable
методы могут быть вызваны только на immutable
объекты. Они могут работать с гарантией *, что их объект (this
) не изменится, никогда.
const
методы могут быть вызваны на const
, immutable
или изменяемые объекты. Они гарантируют, что сами не изменят свой объект, но другие ссылки могут изменить объект.
Я бы пошел с const
если у вас нет веской причины immutable
, как const
функции могут быть вызваны всеми тремя классами хранения изменяемости.
* В любом случае, на уровне системы типов. Мутирование неизменяемого объекта возможно, но вызывает неопределенное поведение.