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

Справочник по языку программирования 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 функции могут быть вызваны всеми тремя классами хранения изменяемости.


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

Другие вопросы по тегам