относительно преобразования lvalue в rvalue - PullRequest
1 голос
/ 18 ноября 2010

"Преобразование lvalue в rvalue не выполняется для операнда унарного оператора &."* Пример:

 int a[]={1,5};
 int* x=&a; 

Ответы [ 3 ]

3 голосов
/ 18 ноября 2010

Ну, это означает, что преобразование lvalue в rvalue не выполнено :-).Преобразование lvalue в rvalue происходит, когда вам нужно значение объекта, а не просто ссылка на него.Получение адреса объекта не требует значения, поэтому нет преобразования lvalue в rvalue.

Я не уверен, насколько это относится к вашему коду.Преобразование, которое не выполняется во второй строке вашего кода, является преобразованием массива в указатель.Конечно, преобразование из lvalue в rvalue также не выполняется, но это довольно интуитивно и нормально.Однако преобразование массива в указатель происходит в большинстве случаев использования массива в выражении, что может удивить некоторых людей.(На самом деле преобразование массива в указатель происходит только при необходимости. Но очень и очень мало операций, которые являются допустимыми для массива, поэтому это очень часто необходимо.) В случае унарного оператора & преобразование массива в указатель нене имеет места (и не может, так как результатом преобразования массива в указатель является rvalue, и унарный & требует lvalue).Итак, вы берете адрес массива, который имеет тип int () [2], то есть указатель на массив из двух int.Что, в свою очередь, делает присвоение недопустимым, поскольку целевой тип не int () [2], а int *, и между ними нет неявного преобразования.

1 голос
/ 18 ноября 2010
int a[] = {1, 5};
int* x = &a;

Это ошибка типа.Оператор & возвращает указатель на свой операнд.Какой у него здесь операнд?Массив из 2 целых чисел. указатель на массив из 2 целых чисел относится не к типу int*, а к типу int(*)[2].

Обратите внимание, как здесь применяется указанное вами правило: во многих контекстах имямассива распадается на указатель на его первый элемент.(Но обычно массивы и указатели не одинаковы !) Вот что происходит, когда вы говорите int* x = a;.Но этот спад не происходит, когда вы применяете оператор & к массиву.(Если это преобразование действительно произошло, &a попытается получить адрес с адресом a, что является бессмысленным.)

1 голос
/ 18 ноября 2010

В выражении преобразование lvalue в rvalue относится к просмотру значения объекта и используется там, где вам нужно значение объекта (например, в a + b вам нужно значения a и b, чтобы определить результат, вам не нужно знать, откуда - если и где - исходные объекты пришли).

В операторе address-of вам необходим сам объект (т. Е. lvalue ), значение объекта не имеет значения, поэтому lvalue преобразование в rvalue было бы бесполезным, оно потеряло бы идентичность (местоположение) самого объекта, что важно для получения адреса.

...