В чем разница между неизменяемыми и константными функциями-членами?

В справочнике по языку программирования D показаны два примера в Declarations и Квалификаторы типов, поэтому возможны оба варианта:

struct S
{
    int method() const
    {
        //const stuff
    }
}

struct S
{
    int method() immutable
    {
        //immutable stuff
    }
}

Из документов:

Константные функции-члены — это функции, которым не разрешено изменять какую-либо часть объекта с помощью ссылки this в функции-члене.

А также:

Неизменяемые функции-члены гарантируют, что объект и все, на что ссылается эта ссылка, неизменны.

Я нашел этот вопрос, но все ответы говорят о типах данных, а не о классах хранения. То же самое касается Часто задаваемых вопросов по D const, хотя читать его интересно.

Так в чем же разница между двумя приведенными выше определениями? Существуют ли выражения, которые могут заменить //const stuff и быть допустимыми, но не //immutable stuff?


person iFreilicht    schedule 19.04.2016    source источник


Ответы (1)


immutable методы можно вызывать только для immutable объектов. Они могут работать с гарантией*, что их объект (this) никогда не изменится.

const методы могут быть вызваны для const, immutable или изменяемых объектов. Они гарантируют, что сами не изменят свой объект, но другие ссылки могут изменить объект.

Я бы выбрал const, если у вас нет веской причины нуждаться в immutable, поскольку функции const можно вызывать со всеми тремя классами хранения изменяемости.


* Во всяком случае, на уровне системы типов. Изменение неизменяемого объекта возможно, но приводит к неопределенному поведению.

person Colonel Thirty Two    schedule 19.04.2016