2015-01-14 3 views
4

Я знаю, что могут быть другие подобные вопросы, но они не совсем ответили на мой вопрос.Is int & foo(); lvalue?

Я просматривал некоторые слайды из лекции о C++ типа дедукции и на одном из них я нашел следующее заявление:

int & foo();   // foo() is lvalue; 

Сначала я подумал, что это неправильно - foo является функция, которую нельзя назначить, это не значение lvalue. Но теперь я думаю, что автор мог иметь что-то другое в виду. А именно, что вызов может быть lvalue, а не самой fuction.

Итак, другие слова:

  1. является foo именующим?
  2. является foo() lvalue?
  3. Может ли fuction (не вызов функции) когда-либо назначаться (то есть foo = something;)?
  4. «lvalue - это каждый объект/предмет, которому можно назначить» - это утверждение всегда правильное и точное?

Вопрос 4 требует еще нескольких пояснений. С этим я пытаюсь понять, что такое lvalue. Другое определение, которое я видел, гласит: «lvalues ​​имеют адреса хранилища, которые могут быть получены». Я не уверен, что Хранение Адрес точно есть, но взятие нашей функции foo в качестве примера - мы можем определенно получить адрес этого fuction. В C++ это просто имя функции

foo; // returns the address of funtion 'foo' 

Но в то же время я не думаю, что мы когда-либо можно присвоить foo (вопрос 3). Итак - это lvalue или нет?

Буду признателен, если вы ответили на все 4 очка. Я отмечаю вопрос как C++, а не C++11, так как я считаю, что этот вопрос относится ко всем версиям языка. Однако, если есть какие-либо различия, укажите их.

+1

Возможно, вам будет интересно просмотреть [этот пост] (http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues) – CoryKramer

+0

Я поддержал, потому что вопрос показывает исследовательские усилия, полезен и ясен. – TartanLlama

ответ

6

foo a lvalue?

Да. Первичным выражением, которое назначает функцию, является lvalue. Однако в некоторых контекстах функция неявно преобразуется в указатель; этот указатель является prvalue (или просто rvalue, до C++ 11).

foo() a lvalue?

Да. Значение вызова функции - это lvalue, если результат lvalue ссылочный тип, как он есть.

может сделать фикцию (не вызов функции) когда-либо будет назначен

No. только изменяемые объекты могут быть назначены.

«lvalue - это каждый объект/предмет, которому можно присвоить» - это утверждение всегда правильное и точное?

Номер именующего этого выражение, которое обозначает функцию или объект. Он может быть назначен только в том случае, если он обозначает изменяемый объект.

Смежные вопросы