2016-07-06 4 views
2

В D, как объявить константу или неизменяемый указатель на неконстантные/изменяемые данные в D?Как объявить константный указатель на не-const/изменяемые данные в D?

Сайт dlang говорит, что вы не можете просто объявить его как const, поскольку это означает, что указатель const и данные, на которые он указывает, не изменяются.

Я читал ранее сообщения, касающиеся этого, которые предполагают, что это просто невозможно. Если это так, то это большая дыра в дизайне языка. Должно быть возможно объявить указатель как немодифицируемый, иначе это безумие. Наличие константы, распространяющейся из указателя, также подразумевает, что данные const являются полезной функцией безопасности по умолчанию.

+1

Это головная конструкция. Уолтер справедливо против этого, поэтому он не существует в D. В группе новостей есть свои рассуждения. –

+2

Возможный дубликат [Правильный способ делать «указатель константы на неконстантный» в D?] (Http://stackoverflow.com/questions/28137190/right-way-to-do-const-pointer-to-non- const-in-d) – ruakh

ответ

3

У вас нет. В D, const, immutable и shared все транзитивные. Таким образом, как только внешняя часть типа const (или immutable или shared), весь тип. В какой-то момент очень на раннем этапе D2, язык имел как голову const, так и хвост const, но это было сочтено слишком сложным, чтобы быть достойным, и оно было удалено (обратно в версии 2.015 IIRC). Итак, теперь const, immutable и shared являются полностью транзитивными, и это было в течение многих лет.

Вы можете объявить такие вещи, как

const(int)* p; 

так, что внутренняя часть типа const, но нет никакого способа, чтобы указать, что внешняя часть является const без все внутри него const, а также.

Итак, да, то, что вы пытаетесь сделать, невозможно в D, что, возможно, менее гибко, чем могло бы быть идеальным, но голова const также сжимает наименее полезную форму const. Итак, хотя это может быть потеря, насколько я могу судить, это действительно не большой. А разрешающая головка const была бы действительно усложняла вещи - особенно когда immutable и shared вступили в игру. Таким образом, нынешняя система намного проще, не теряя при этом значительной мощности, что делает ее очень хорошим компромиссом.

Если вы действительно хотели что-то вроде головы const, вы всегда можете создать тип обертки, который запретил назначение, но это самое близкое, что вы собираетесь получить.

+0

Дополнение: обратите внимание, что в D легко реализовать HeadConst в [код пользователя] (https://github.com/dlang/phobos/pull/3862) – greenify