Понимание косвенности через указатели и получение адреса - PullRequest
0 голосов
/ 13 декабря 2018

В стандарте N1570 , Section 6.5.3.2#3 указано следующее (emp. Mine):

Если операнд является результатом унарного * оператора, то ни то, ни другоеоператор и оператор & не оцениваются, и результат, как если бы оба были опущены, за исключением того, что ограничения на операторы все еще применяются и результат не является lvalue .

Позже в разделе 6.5.3.2#4 указано:

Если операнд указывает на функцию, результатом является обозначение функции;если он указывает на объект, результатом является lvalue , обозначающее объект .

Thisдва раздела кажутся мне противоречивыми.Первый из приведенных мною указывает, что result is not an lvalue, а второй указывает, что результатом оператора косвенного обращения является lvalue.

Не могли бы вы объяснить это?Значит ли это, что в случае объекта операторы * и & не исключают друг друга?

1 Ответ

0 голосов
/ 13 декабря 2018

Раздел 6.5.3.2 # 3 говорит об унарном операторе &, а 6.5.3.2 # 4 - об унарном операторе *.Они имеют различное поведение.

Разработка ( из комментария ):

Дело в том, что унарный & не приводит к lvalue, даже в случае, когда онсчитается опущенным, потому что он непосредственно предшествует унарному * в контексте разыменования.Тот факт, что оба оператора считаются опущенными, не меняет того факта, что полученное выражение не является lvalue;Точно так же не было бы, если бы применялись одиночные унарные &.

int a; 
&a = ...; 

не является законным (очевидно).Но и то, и другое не является

int a; 
&*a = ...;

То, что они считаются опущенными, не означает, что &* эквивалентно lvalue по отношению к соло a.

...