Использование функции, возвращающей указатель как LValue

Почему я не могу использовать функцию, возвращающую указатель как lvalue?

Например, этот работает

int* function()
{
    int* x;
    return x;
}

int main()
{
    int* x = function();
    x = new int(9);
}

но не это

int* function()
{
    int* x;
    return x;
}

int main()
{
   int* x;
   function() = x;
}
  1. Хотя я могу использовать переменную-указатель как lvalue, почему я не могу использовать функцию, возвращающую указатель как lvalue?

  2. Кроме того, когда функция возвращает ссылку вместо указателя, она становится допустимым lvalue.


person infinity    schedule 27.04.2010    source источник
comment
Вы пробовали заключать это в круглые скобки? например _1 _... также, вы пытаетесь назначить его или местоположение, на которое указывает (т.е. x = somepointer; или *x = somepointer;)? Есть разница.   -  person Amber    schedule 27.04.2010


Ответы (2)


Ваш первый образец не соответствует тому, почему я думаю, что вы так думаете. Сначала вы сохраняете результат вызова функции в переменной x, а затем заменяете значение x вновь созданным массивом. * (function ()) = 5 должен правильно попытаться записать 5 в произвольную ячейку памяти, указанную локальной переменной x внутри вашей функции.

Образец:

int x;

int* function()
{
    return &x;
}

int main()
{
   *(function()) = 5;
   printf("%d\n", x);
}
person MK.    schedule 27.04.2010

Пожалуйста, еще раз проверьте последний оператор main () во втором фрагменте кода. Lvalue - это переменные, которые можно использовать слева от оператора присваивания (=). Фактически вы присваиваете значение x функции, а не наоборот. Функция может принимать аргументы или возвращать значения. Вы не можете напрямую присвоить им значение.

person AruniRC    schedule 27.04.2010