Здравствуйте, Максим Рогожин, Вы писали:
МР>Привет!
МР>Можно ли считать ссылки (lvalue reference, rvalue reference) типом данных? Если нет, то тогда чем их считать?
Вот, что сказано в стандарте:
6.9 Types 1 [ Note: 6.9 and the subclauses thereof impose requirements on implementations regarding the representation of types. There are two kinds of types: fundamental types and compound types. Types describe objects (4.5), references (11.3.2), or functions (11.3.5). —end note ]
R>6.9 Types
R>1 [ Note: 6.9 and the subclauses thereof impose requirements on implementations regarding the representation of types. There are two kinds of types: fundamental types and compound types. Types describe objects (4.5), references (11.3.2), or functions (11.3.5). —end note ]
Объекты и функции имеют некоторое бинарное представление, занимают некоторую память, то что у них должен быть тип это ясно. Но вот ссылки не имеют бинарного представления, не занимают памяти (могут не занимать), то есть их как бы и нет даже. Тип ссылки это тип чего? Выражения в коде программы?
R>>6.9 Types
R>>1 [ Note: 6.9 and the subclauses thereof impose requirements on implementations regarding the representation of types. There are two kinds of types: fundamental types and compound types. Types describe objects (4.5), references (11.3.2), or functions (11.3.5). —end note ]
МР>Объекты и функции имеют некоторое бинарное представление, занимают некоторую память, то что у них должен быть тип это ясно. Но вот ссылки не имеют бинарного представления, не занимают памяти (могут не занимать), то есть их как бы и нет даже. Тип ссылки это тип чего? Выражения в коде программы?
Попробую "на пальцах". Имхо, твое недоумение вызвано тем, что ты пытаешься думать о ссылке как об объекте. А между тем, в выделенном фрагменте ссылки как раз и перечислены отдельно от объектов потому, что ссылки и объекты — разные сущности. Пункт 11.3.2 вводит понятие ссылки (reference) и ссылочного типа (reference type). Таким образом, тип ссылки — это просто тип ссылки — тот самый ссылочный тип. Иными словами, для того, чтобы сущность имела тип, ей не обязательно "иметь бинарное представление" (т.е. быть объектом).
Например, декларатор "int& ir = . . ." объявляет ссылку ir, типом которой является "lvalue reference to int".
Type, Type* и Type& — есть разные типы. Как минимум с точки зрения языковых конструкций. Представление же последних двух в рантайме с оптимизациями может сделать так, что их как бы и нет. При этом, ссылки в оптимизациях выпадают напроч, т.к. ссылка это не более чем обычный указатель посыпанный сверху тонной ереси и баек.
для того, чтобы сущность имела тип, ей не обязательно "иметь бинарное представление" (т.е. быть объектом).
Вот это как раз очень интересно.
Я и говорю тип выражения в коде программы?
А есть другие примеры таких сущностей без бинарного представления в C++ или других языках?
Здравствуйте, Mystic Artifact, Вы писали:
MA>Как минимум с точки зрения языковых конструкций.
Вот ссылки это как раз чисто языковая конструкция имхо (а не тип данных). Так как если бы они были типом данных, то что есть данные для int&?
Здравствуйте, Максим Рогожин, Вы писали:
МР>для того, чтобы сущность имела тип, ей не обязательно "иметь бинарное представление" (т.е. быть объектом).
МР>Вот это как раз очень интересно. МР>Я и говорю тип выражения в коде программы?
Ну я бы сказал так, но боюсь уже — тут же прибежит σ и начнет меня тыкать носом в каждую неосторожно написанную букву. С "типом выражения" как выяснилось
, вообще все не так непросто — стандарт повсеместно использует это словосочетание, но нигде не дает прямого определения, что это такое, его можно вывести только через другие понятия. Не так давно было довольно обширное обсуждение, в котором простому смертному вообще трудно понять, где праведное, а где грешное (смотри диалог между σ и N.I. в том же топике).
МР>А есть другие примеры таких сущностей без бинарного представления в C++ или других языках?
Есть — еще одна такая сущность перечислена в том же самом фрагменте, посмотри еще раз:
6.9 Types 1 [ Note: 6.9 and the subclauses thereof impose requirements on implementations regarding the representation of types. There are two kinds of types: fundamental types and compound types. Types describe objects (4.5), references (11.3.2), or functions (11.3.5). —end note ]
Здравствуйте, Максим Рогожин, Вы писали:
МР>Вот ссылки это как раз чисто языковая конструкция имхо (а не тип данных). Так как если бы они были типом данных, то что есть данные для int&?
Указатель, с помощью которого он ссылается на int. Отсюда можно выкинуть указатель, т.к. это совершенно не принципиально с точки зрения языка, и это скорее деталь реализации, но сли его выкинуть — должно появиться что-то другое.
Все дальнейшие инсинуации, вроде передачи по значению, не обязаны знать о ссылке как типе, достаточно классического указателя. Но это уже совсем иная песня.
Проще всего и указатель и референс представить как некий дженерик тип ptr<T> и ref<T> — так наверное нагляднее.
Здравствуйте, Максим Рогожин, Вы писали:
MA>>Как минимум с точки зрения языковых конструкций. МР>Вот ссылки это как раз чисто языковая конструкция имхо (а не тип данных). Так как если бы они были типом данных, то что есть данные для int&?
Перечитал вопрос еще раз и решил еще раз на него ответить.
Мне видится глупым, что в языке вообще существует такой тип данных вообще — он может быть передан в функцию, но не может быть полем. Т.е. он изначально играет декларативную (фиктивную) роль и имеет семантику схожую с указателем по определению.
Тем не менее, как бы ни хотелось — в физические функции нам надо, что-то подавать. На практике, в худшем случае, мы знаем, что это указатель.
Просто особенность типа именно в его неприменимости к полям — но, извините, любой параметр функции имеет тип. Поэтому, это отдельно стоящий тип, который воплощается в реальности во что-то (понятно, во что, если еще раз повторюсь, меня прибьют.)
MA> Мне видится глупым, что в языке вообще существует такой тип данных вообще — он может быть передан в функцию, но не может быть полем.
Что такое поле и какой тип им быть не может?
Здравствуйте, rg45, Вы писали:
R>Есть — еще одна такая сущность перечислена в том же самом фрагменте, посмотри еще раз:
R>
R>6.9 Types
R>1 [ Note: 6.9 and the subclauses thereof impose requirements on implementations regarding the representation of types. There are two kinds of types: fundamental types and compound types. Types describe objects (4.5), references (11.3.2), or functions (11.3.5). —end note ]
Здравствуйте, Максим Рогожин, Вы писали:
МР>Функции? Но функции имеют бинарное представление.
Мне аж интересно, откуда ты черпаешь информацию. Что это за источник, где сказано, что функции "имеют бинарное представление", а ссылки нет? И что там с life time и storage duration функций, не подскажешь?
А заодно, может, объяснишь, как так получается, что добавление фунциии в класс не влияет на его размер, а добавление ссылки влиеяет: https://ideone.com/6twmUT. По твоим-то сведениям все должно быть наоборот?
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Максим Рогожин, Вы писали:
МР>>Функции? Но функции имеют бинарное представление.
R>Мне аж интересно, откуда ты черпаешь информацию. Что это за источник, где сказано, что функции "имеют бинарное представление", а ссылки нет? И что там с life time и storage duration функций, не подскажешь?
Согласен, функции не всегда имеют бинарное представление — inline функции, например)
R>А заодно, может, объяснишь, как так получается, что добавление фунциии в класс не влияет на его размер, а добавление ссылки влиеяет: https://ideone.com/6twmUT. По твоим-то сведениям все должно быть наоборот?
Ну с функциями класса то все ясно — это информация времени компиляции, в рантайме нет никаких функций классов, только данные остаются.
А добавление ссылки — видимо это требование стандарта, что ссылка в классе должна быть фактической т.е. всегда занимать место в представлении класса
МР>>Ты еще спроси зачем σ все его знания стандарта))
R>зачем ему это надо или не надо я смогу понять R>я не понимаю зачем это вам
А зачем вам это понимать??