Из каких lvalue нельзя брать адрес?

В этой конференции Скотт Мейерс начинает со слов lvalues обычно являются выражениями, адрес которых можно взять. Я подчеркиваю слово в целом: что такое lvalue, адрес которого вы не можете взять? (если он есть).

EDIT: предоставьте фрагменты кода вместе с вашими ответами, это прояснит ситуацию.


person qdii    schedule 08.11.2012    source источник
comment
Вы имели в виду lvalues в своем заголовке??   -  person πάντα ῥεῖ    schedule 09.11.2012
comment
да о.О не могу поверить, что написал rvalue   -  person qdii    schedule 09.11.2012
comment
Я не смотрел полное видео конференции, но, глядя на текст вокруг, я думаю, что С.М. здесь действительно говорится о «rvalues». Самое важное, что я нашел по вашему вопросу, похоже, находится здесь: (thbecker.net/articles/ rvalue_references/section_05.html)   -  person πάντα ῥεῖ    schedule 09.11.2012
comment
Единственное, что приходит мне на ум, зависит от аппаратного обеспечения. В DSP TI они расширили C/C++ таким образом, что вы можете иметь extern cregister volatile unsigned int AMR;, где AMR относится к конкретному аппаратному регистру (в данном случае к регистру режима адресации).   -  person Bill Lynch    schedule 09.11.2012


Ответы (2)


Я думаю, что битовые поля удовлетворяют вашим условиям... Я считаю, что f.x - это lvalue, но вы не можете взять его адрес. Интересно, что вы также не можете сделать auto & x = f.x.

C++11, раздел 8.3.1, часть параграфа 4: Поскольку адрес битового поля (9.6) не может быть взят, указатель никогда не может указывать на битовое поле.

struct foo {
    int x : 3;
    int y : 3;
    int z : 3;
};

int main() {
    foo f;

    f.x = 3;
}

Я еще менее уверен в другой идее, но стандарт говорит, что вам не разрешено использовать основную функцию. Если он используется для получения адреса main, этого также будет достаточно. C++11 3.6.1 Параграф 5.


Из комментария, который я оставил, я знаю, что TI расширяет свои компиляторы C и C++ таким образом, что существует класс хранения с именем cregister, адрес которого нельзя взять. (Поскольку это относится к физическому регистру, в котором нет концепции адреса).

person Bill Lynch    schedule 08.11.2012
comment
Получение чьего-либо адреса квалифицируется как использование ODR, поэтому я думаю, что вы правы насчет main. - person ildjarn; 09.11.2012
comment
@ildjarn Но поскольку main все равно не является lvalue, чем это интересно? - person Konrad Rudolph; 09.11.2012
comment
@Konrad: main - это функция, а функции - это lvalue. Я не вижу в §3.6.1 ничего, что говорило бы об обратном — что я упускаю? - person ildjarn; 10.11.2012
comment
@ildjarn Функции являются lvalue? Ой, C++ меня чертовски смущает. Вы не можете назначить функцию. Почему тогда это lvalue? Интуитивно этого не должно быть… только потому, что вы можете взять его адрес? (Ну, местнически, потому что так сказано в §3.10, но это, конечно, не объяснение…) - person Konrad Rudolph; 12.11.2012

Вы можете брать адреса из именованных символов (например, вместо временных экземпляров). Насколько я понял это объяснение, это то, что составляет значение lvalue.

person πάντα ῥεῖ    schedule 08.11.2012