Re[8]: Вопрос про ссылки - что бы сломалось, если...
От: rg45_from_ban  
Дата: 10.07.24 17:15
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Тут речь про возвращаемый тип, а не ссылку.

BFE>Сказать, что функция возвращает ссылку, это всё равно, что сказать, что функция возвращает имя.

Перечитай еще раз мое сообщение
Автор: rg45_from_ban
Дата: 10.07 19:42
— я там обновил цитату из более новой версии стандарта. Там русским по белому перечисленно, чем может быть return type и один из вариантов — ссылка.
Отредактировано 10.07.2024 17:30 rg45_from_ban . Предыдущая версия . Еще …
Отредактировано 10.07.2024 17:25 rg45_from_ban . Предыдущая версия .
Re[9]: Вопрос про ссылки - что бы сломалось, если...
От: rg45_from_ban  
Дата: 10.07.24 17:23
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>Тут речь про возвращаемый тип, а не ссылку.

BFE>>Сказать, что функция возвращает ссылку, это всё равно, что сказать, что функция возвращает имя.

__>Перечитай еще раз мое сообщение
Автор: rg45_from_ban
Дата: 10.07 19:42
— я там обновил цитату из более нового стандарта. Там русским по белом перечисленно, чем может быть return type и один из вариантов — ссылка.


Ну и чтоб два раза не вставать:

https://timsong-cpp.github.io/cppwp/expr.call#4

If the postfix-expression names a destructor or pseudo-destructor, the type of the function call expression is void; otherwise, the type of the function call expression is the return type of the statically chosen function (i.e., ignoring the virtual keyword), even if the type of the function actually called is different...


То есть, типом function call expression является return type функции.
Re[8]: Вопрос про ссылки - что бы сломалось, если...
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 17:23
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Сказать, что функция возвращает ссылку, это всё равно, что сказать, что функция возвращает имя.


Э-э-э... А как еще можно более коротко и менее формально сказать "функция возвращает значение ссылочного типа"? В английском термины "reference type" и "reference" в отношении значений тоже эквивалентны.
Re[7]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 10.07.24 17:39
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>Не, там есть тип возвращаемого значения, а ссылки — нет.

ЕМ>Э-э-э... Функция определена так:
ЕМ>
ЕМ>template < class T > const T& max ( const T& a, const T& b );
ЕМ>

ЕМ>Она возвращает константную ссылку.
Так говорят, но строго говоря это не про ссылку, а про тип: возвращаемый тип — это константная ссылка.

ЕМ>Где именно, по-Вашему, эта ссылка исчезает?

Вопрос не в том, где она исчезает, а в том, где появляется. Ссылка — это не объект, она даже памяти не занимает, если имплементация позволяет. А уж в вызовах для int'ов вообще все ссылки отбрасываются и работают прямо со значениями, например в выражении: int n = std::max(42, 43); нет разницы ссылки тут или int'ы, так как наблюдаемый результат будет тот же. Если же написать const int& r = std::max(42, 43);, то — да: тут появляется ссылка, так как появилось имя.
И каждый день — без права на ошибку...
Re[8]: Вопрос про ссылки - что бы сломалось, если...
От: rg45_from_ban  
Дата: 10.07.24 17:39
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Сказать, что функция возвращает ссылку, это всё равно, что сказать, что функция возвращает имя.


С хрена ли?
Re[9]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 10.07.24 17:46
Оценка:
Здравствуйте, rg45_from_ban, Вы писали:

BFE>>Тут речь про возвращаемый тип, а не ссылку.

BFE>>Сказать, что функция возвращает ссылку, это всё равно, что сказать, что функция возвращает имя.

__>Перечитай еще раз мое сообщение
Автор: rg45_from_ban
Дата: 10.07 19:42
— я там обновил цитату из более новой версии стандарта. Там русским по белому перечисленно, чем может быть return type и один из вариантов — ссылка.

Русским? Ссылка?
Или, таки, английский и reference type?
И каждый день — без права на ошибку...
Re[10]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 10.07.24 17:48
Оценка:
Здравствуйте, rg45_from_ban, Вы писали:

__>То есть, типом function call expression является return type функции.


Я различаю ссылку и ссылочный тип. Для меня это два разных понятия.
И каждый день — без права на ошибку...
Re[10]: Вопрос про ссылки - что бы сломалось, если...
От: rg45_from_ban  
Дата: 10.07.24 17:51
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Русским? Ссылка?

BFE>Или, таки, английский и reference type?

Ну, reference type, конечно. И? Что это меняет?
Re[8]: Вопрос про ссылки - что бы сломалось, если...
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 18:00
Оценка:
Здравствуйте, B0FEE664, Вы писали:

ЕМ>>Она возвращает константную ссылку.


BFE>Так говорят, но строго говоря это не про ссылку, а про тип: возвращаемый тип — это константная ссылка.


Функция не может "возвращать тип". То, что реально (кроме фиктивного void) возвращает любая функция — это всегда значение (число определенной разрядности). В C/C++ этому значению приписывается еще и тип (как характеристика значения, способ его истолкования). То есть, значение первично (без него никак), тип вторичен (в ряде случаев его можно игнорировать).

Правильный перевод английского "return type" — "тип возвращаемого значения". "Возвращаемый тип" — это просторечие, жаргонизм, который допустимо использовать лишь тогда, когда всем участникам понятен точный смысл.

BFE>Ссылка — это не объект, она даже памяти не занимает, если имплементация позволяет.


Если ссылка существует физически (в виде адреса) — она всегда занимает хоть какую-то память (как физическое устройство хранения), в том числе и регистр.

BFE>А уж в вызовах для int'ов вообще все ссылки отбрасываются и работают прямо со значениями, например в выражении: int n = std::max(42, 43); нет разницы ссылки тут или int'ы, так как наблюдаемый результат будет тот же.


При чем здесь int? С точки зрения правил языка, так будет для объекта любого типа. И даже в исполняемом коде, если компилятор точно знает, с каким объектом связана ссылка, он может обойтись без косвенной адресации, работая с объектом напрямую (хоть в регистре). А если ссылка входит в константное выражение, вычислимое на этапе компиляции, то она и вовсе не попадет в исполняемый код в виде "указующего объекта". Но при этом в выражении, содержащем ссылку (явно или неявно), она будет вести себя по правилам, установленным языком для ссылок.

BFE>Если же написать const int& r = std::max(42, 43);, то — да: тут появляется ссылка, так как появилось имя.


Тут появляется не ссылка, как таковая, а именованная ссылка.
Re[3]: А вы с какой целью интересуетесь?
От: Carc Россия http://www.amlpages.com/home.php
Дата: 10.07.24 18:07
Оценка: :)
Здравствуйте, Doom100500, Вы писали:

D>...бы было бы если бы относительно C++ осмысленны так же, как рассуждения о том, что было бы если бы Shmj перестал засирать RSDN своей тупизной.


D>А что так можно было что-ли?

Нет, нельзя. Тогда это было бы так называемое (ц) другое (ц)
Aml Pages Home
Отредактировано 10.07.2024 18:09 Carc . Предыдущая версия .
Re[11]: Вопрос про ссылки - что бы сломалось, если...
От: rg45_from_ban  
Дата: 10.07.24 18:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Я различаю ссылку и ссылочный тип. Для меня это два разных понятия.


Да кто ж с этим спорит. Конечно, это два разных понятия — точно так же, как объект и тип объекта. Только что это меняет? Ты хочешь сказать, что вот в таком случае:

auto p = std::unique_ptr<int>(42);
*p = 43;


выражение *p не вычисляется в ссылку?
Отредактировано 10.07.2024 18:11 rg45_from_ban . Предыдущая версия .
Re[9]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 10.07.24 18:26
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>>>Она возвращает константную ссылку.

BFE>>Так говорят, но строго говоря это не про ссылку, а про тип: возвращаемый тип — это константная ссылка.
ЕМ>Функция не может "возвращать тип".
Тип возвращать не может, а возвращаемый тип у функции есть.

ЕМ>То, что реально (кроме фиктивного void) возвращает любая функция — это всегда значение (число определенной разрядности).

В том то и дело, что это не так. Нет никаких "реально", так как "реально" не относится к виртуальной машине, которую описывает стандарт. К реальному относятся только побочные эффекты и текст кода, а всё остальное абстрактно. Вызов функции может быть вообще выкинут, если результат не используется. О чём таком реальном вы пишите?

ЕМ>В C/C++ этому значению приписывается еще и тип (как характеристика значения, способ его истолкования). То есть, значение первично (без него никак), тип вторичен (в ряде случаев его можно игнорировать).

Значение тоже вторично, так может быть вычислено использовано и выкинуто ещё на этапе компиляции.

ЕМ>Правильный перевод английского "return type" — "тип возвращаемого значения". "Возвращаемый тип" — это просторечие, жаргонизм, который допустимо использовать лишь тогда, когда всем участникам понятен точный смысл.

Нет способа убедиться, что всем участникам понятен точный смысл. Более того, нет способа убедится, что мне (или вам) понятен точный смысл.

BFE>>Ссылка — это не объект, она даже памяти не занимает, если имплементация позволяет.

ЕМ>Если ссылка существует физически (в виде адреса) — она всегда занимает хоть какую-то память (как физическое устройство хранения), в том числе и регистр.
Или не существует и не занимает.
Сейчас, к сожалению не пишут самоизменяющийся исполняемый код (из-за борьбы с вирусами), но стандарт такого не запрещает.

BFE>>А уж в вызовах для int'ов вообще все ссылки отбрасываются и работают прямо со значениями, например в выражении: int n = std::max(42, 43); нет разницы ссылки тут или int'ы, так как наблюдаемый результат будет тот же.


ЕМ>При чем здесь int? С точки зрения правил языка, так будет для объекта любого типа.

Я тоже так думал, но нет. Для базовых типов в стандарте часто прописывают исключения.

ЕМ> И даже в исполняемом коде, если компилятор точно знает, с каким объектом связана ссылка, он может обойтись без косвенной адресации, работая с объектом напрямую (хоть в регистре). А если ссылка входит в константное выражение, вычислимое на этапе компиляции, то она и вовсе не попадет в исполняемый код в виде "указующего объекта". Но при этом в выражении, содержащем ссылку (явно или неявно), она будет вести себя по правилам, установленным языком для ссылок.

Если всё так, то против чего, вы, собственно, возражаете?

BFE>>Если же написать const int& r = std::max(42, 43);, то — да: тут появляется ссылка, так как появилось имя.

ЕМ>Тут появляется не ссылка, как таковая, а именованная ссылка.
Что такое "не именнованая ссылка"?
И каждый день — без права на ошибку...
Re[12]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 10.07.24 18:40
Оценка:
Здравствуйте, rg45_from_ban, Вы писали:

BFE>>Я различаю ссылку и ссылочный тип. Для меня это два разных понятия.

__>Да кто ж с этим спорит. Конечно, это два разных понятия — точно так же, как объект и тип объекта. Только что это меняет? Ты хочешь сказать, что вот в таком случае:
__>
__>auto p = std::unique_ptr<int>(42);
__>*p = 43;
__>

__>выражение *p не вычисляется в ссылку?
Вы опять про выражения?
А выражение n + 1; вычисляется в ссылку?:
int n = 0;
n + 1;
И каждый день — без права на ошибку...
Re[5]: Вопрос про ссылки - что бы сломалось, если...
От: andrey.desman  
Дата: 10.07.24 19:27
Оценка:
Здравствуйте, rg45, Вы писали:

AD>>Так это тип, а не ссылка.

R>Конечно же, у результата есть тип. Но есть же и сам результат — та самая ссылка. Есть временный объект, к которому привязана ссылка. И это можно даже визуализировать:

Если полезть в стандарт, то концов там не найдешь. Вокруг ссылок и ссылочных типов много разного словоблудия с переподвыподвертом.

У нас все же принято под ссылкой понимать именно имя, а все остальное, оно про тип: передачу по ссылке, возврат по ссылке и т.д.
Re[10]: Вопрос про ссылки - что бы сломалось, если...
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 20:49
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Тип возвращать не может, а возвращаемый тип у функции есть.


Это не "возвращаемый тип", а "тип возвращаемого значения" (value type).

BFE>Значение тоже вторично, так может быть вычислено использовано и выкинуто ещё на этапе компиляции.


В контексте результата функции оно первично, ибо существует всегда, если его тип не void, и функция обязана его вернуть.

ЕМ>>При чем здесь int? С точки зрения правил языка, так будет для объекта любого типа.


BFE>Я тоже так думал, но нет. Для базовых типов в стандарте часто прописывают исключения.


Что именно в стандарте прописано для фундаментальных типов? Если Вы про интерпретацию типа значения выражения, то в этом контексте ссылка на любой тип сводится к самому типу, чисто для упрощения анализа. Но формально-то T f () и T const & f () — разные функции. Тип результата вызова первой — T, второй — T const &. А уже при оптимизации выражения, в которое входит вызов (именно самого выражения, а не порождаемого им кода), компилятор имеет право забыть, что во втором случае возвращена именно ссылка, а не само значение, если они их фактический смысл одинаков.

BFE>Если всё так, то против чего, вы, собственно, возражаете?


Против выражения "возвращаемый тип".

А ссылка в обсуждаемом выражении таки есть — ее возвращает std::max в операторе return. Возвращаемое ею значение имеет ссылочный тип.

BFE>Что такое "не именнованая ссылка"?


Значение ссылочного типа (T &), существующее отдельно от именованного объекта.
Re[13]: Вопрос про ссылки - что бы сломалось, если...
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 20:52
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А выражение n + 1; вычисляется в ссылку?:

BFE>
BFE>int n = 0;
BFE>n + 1;
BFE>


Нет — здесь нигде не возникает значений ссылочного типа (int &) — хоть в явном виде, хоть в результате преобразования.
Re[6]: Вопрос про ссылки - что бы сломалось, если...
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 20:57
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>У нас все же принято под ссылкой понимать именно имя, а все остальное, оно про тип: передачу по ссылке, возврат по ссылке и т.д.


Это неправильно, так как путаются понятия ссылочного типа и ссылки, как "указующего", "косвенного" объекта. В передаче и возврате по ссылке участвует именно ссылка-объект, а не просто ссылочный тип или "синоним".
Re[14]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 11.07.24 09:52
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>А выражение n + 1; вычисляется в ссылку?:

BFE>>
BFE>>int n = 0;
BFE>>n + 1;
BFE>>


ЕМ>Нет — здесь нигде не возникает значений ссылочного типа (int &) — хоть в явном виде, хоть в результате преобразования.

Что насчёт 'int&&'?
И каждый день — без права на ошибку...
Re[2]: Вопрос про ссылки - что бы сломалось, если...
От: sergii.p  
Дата: 11.07.24 09:58
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Мешает то, что если ссылка начнёт менять то, на что она ссылается, то она сможет принимать и неинициализированное значение, что сразы же убирает уверенность в её валидности.


первое из второго вроде как не следует. Ну закройте "конструктор по умолчанию" для ссылок вот и пропадут неинициализированные значения. Тот же reference_wrapper гарантирует, что выдаст ненулевой адрес.
Тот же код на Rust гарантирует валидность и компилируется

let i = 0;
let k = 1;
let mut ref_i = &i;
ref_i = &k;


Получается, проблема таки в синтаксисе — нет механизма переприсвоить ссылку. И это таки баг языка (имхо конечно).

p.s. Кстати, заметьте, насколько в Rust тривиальное определение ссылки. Это просто адрес. А в С++ уже на 10 страниц развели спор об определении.
Re[11]: Вопрос про ссылки - что бы сломалось, если...
От: B0FEE664  
Дата: 11.07.24 10:00
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

BFE>>Тип возвращать не может, а возвращаемый тип у функции есть.

ЕМ>Это не "возвращаемый тип", а "тип возвращаемого значения" (value type).
Хорошо, пусть будет тип возвращаемого значения.

BFE>>Значение тоже вторично, так может быть вычислено использовано и выкинуто ещё на этапе компиляции.

ЕМ>В контексте результата функции оно первично, ибо существует всегда, если его тип не void, и функция обязана его вернуть.
В каком смысле "существует"?

ЕМ>>>При чем здесь int? С точки зрения правил языка, так будет для объекта любого типа.

BFE>>Я тоже так думал, но нет. Для базовых типов в стандарте часто прописывают исключения.
ЕМ>Что именно в стандарте прописано для фундаментальных типов? Если Вы про интерпретацию типа значения выражения, то в этом контексте ссылка на любой тип сводится к самому типу, чисто для упрощения анализа.
Да, я именно про это. ссылка не на любой тип сводится к самому типу, так как для объектов могут быть написаны перегрузки функций и операций для ссылок.

ЕМ> Но формально-то T f () и T const & f () — разные функции. Тип результата вызова первой — T, второй — T const &. А уже при оптимизации выражения, в которое входит вызов (именно самого выражения, а не порождаемого им кода), компилятор имеет право забыть, что во втором случае возвращена именно ссылка, а не само значение, если они их фактический смысл одинаков.

Согласен.

BFE>>Если всё так, то против чего, вы, собственно, возражаете?

ЕМ>Против выражения "возвращаемый тип".
Хорошо, пусть будет тип возвращаемого значения.

ЕМ>А ссылка в обсуждаемом выражении таки есть — ее возвращает std::max в операторе return. Возвращаемое ею значение имеет ссылочный тип.

BFE>>Что такое "не именнованая ссылка"?
ЕМ>Значение ссылочного типа (T &), существующее отдельно от именованного объекта.
Вот вы пишите про "выражение". Какой смысл вы вкладываете с слово "существует" в таком контексте?
И каждый день — без права на ошибку...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.