0 / 0 / 0
Регистрация: 18.08.2017
Сообщений: 1
|
||||||
1 | ||||||
Конвертация между rvalue и lvalue при передаче аргумента в функцию18.08.2017, 22:45. Показов 2777. Ответов 15
Как это конвертируется если я обявил аргумент типа lvalue а передаю обьект rvalue ?
0
|
18.08.2017, 22:45 | |
Ответы с готовыми решениями:
15
C++ expressions - rvalue, glvalue, prvalue, xvalue, lvalue, а также rvalue reference: что есть что? Lvalue и rvalue Значения Lvalue и Rvalue Rvalue и lvalue ссылки |
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
|
||||||
19.08.2017, 02:25 | 3 | |||||
на самом деле это rvalue-reference(rvalue – все, у чего нету имени).
После объявления такие переменные – одно и то же:
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
||||||
19.08.2017, 10:54 | 6 | |||||
GbaLog-,
Уверены?
Добавлено через 7 минут f.get() тут разве не rvalue?
0
|
875 / 461 / 91
Регистрация: 10.06.2014
Сообщений: 2,669
|
|
19.08.2017, 12:44 | 8 |
GbaLog-,
Так rvalue же это свойство выражений а не данных(это я к тому, что от того что я уберу ссылку в возвращаемом типе само выражение вызывающее функцию не изменится)
0
|
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
|
||||||
19.08.2017, 13:10 | 9 | |||||
Ошибся, перепутал с
MyClass my = "my"; Да, верно. Но все же VС++ позволяет делать подобное(а почему бы и нет?). И при этом можно rvalue reference присвоить к lvalue reference: http://rextester.com/edit/AAWNQD10555
0
|
Любитель чаепитий
|
|
19.08.2017, 16:02 | 10 |
ещё как изменится, раньше было
test(int&); , что подходило под сигнатуру функции целиком и полностью.потом станет test(int); , но при этом test не способна принять временный объект, а возвращаемый из get объект временный.вызывающий код не изменится, но вот контекст поменяется, на что и среагирует компилятор.
1
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
|
19.08.2017, 16:52 | 11 |
Тип возвращаемого значения у функции lvalue-ссылка, значит выражение, состоящее из вызова этой функции, является lvalue.
Вы перепутали lvalue-reference с lvalue. Изменится его категория. С lvalue на prvalue.
1
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
19.08.2017, 16:52 | 12 | |||||||||||||||
и другое - что компилятор не станет делать подобных преобразований неявно с чем может быть связан запрет? на самом деле вопрос интересный) я подозреваю, что это как то связанно с "историческим" наследием языка си. но что характерно, даже вижуал студия, с её "нестандартным расширением от компилятора" отказалась компилить такой код: http://rextester.com/OHZB45178
что литерные числовые константы - это константы нельзя модифицировать их значения. однако временный объект константным не является. в действительности, если бы это был объект класса, то можно было бы вполне законно вызывать любые его не-константные функции-члены. и вот здесь частоколом возникают перпендикулярные проблемы дизайна: так временный объект, он константный или нет? и если он - константа, тогда какого фига он не наделен квалификатором const ? или вот такой вопросик: если числовые литерные константы - это константы, тогда что именно мы модифицировали в этом коде?
0
|
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
|
|
19.08.2017, 18:30 | 13 |
неявную переменную-посредник
это да, странно. Эдакое исключение, просто "потому что" а чего ему быть константным? Const же для имен, чтобы не начудить. опять же, как они могут быть константами
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
19.08.2017, 19:01 | 14 | |||||
с какой стати?
что вы вообще хотите этим сказать? что rvalue-reference ссылается не на временный объект, который вернула функция, а на его копию? то бишь у нас на самом деле два временных объекта. что за бред? язык различает константные объекты (рожденные константными), и все прочие объекты. стандарт говорит: модификация объекта, константного от рождения - UB вообще то, компилятор может и не выделять память под числовые константы, а тупо инлайном подставлять значение по месту использования. однако, литерная числовая константа - полноценный объект. а значит, мы вполне легально можем попросить его адрес:
кроме как честно расположить объект в памяти. что бы можно было вернуть его адрес. однако, компилятор видит - что объект "константа от рождения", и может запросто расположить его в памяти "только для чтения". если в последствии мы применим const_cast, и сняв с объекта константность, попробуем модифицировать его, то запросто можем нарваться на "акццесс виолейшен", например. в кратце: компилятор видя, что объект - константа от рождения, закладывается на его неизменчивость, что открывает ему пути для возможных оптимизаций. как литерная числовая константа может быть константой? вы вообще понимаете о чем спрашиваете? литерные числовые константы - не просто константы. это - константы времени компиляции.
0
|
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
|
|
19.08.2017, 19:34 | 15 |
hoggy, извини, но дальнейшее обсуждение бесполезно. Ты видишь так, я вижу так.
И уж тем более, письменный-то спор будет просто трепкой нервов
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
19.08.2017, 19:45 | 16 |
бесполезно обсуждать что либо с водителем,
который руководствуется собственным виденьем, а не ПДД.
0
|
19.08.2017, 19:45 | |
19.08.2017, 19:45 | |
Помогаю со студенческими работами здесь
16
Почему i++ это rvalue, а ++i lvalue? Что такое rvalue и lvalue Непонятное поведение rvalue/lvalue Семантика перемещения rvalue\lvalue ссылок Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |