№1. const void* f(const int& c) { return &c; } main { const void* p = f(4); const int* pi = (const int*)p; std::cout<<*pi; } №2. class cC { public: const char* pMsg; public: cC(const char* msg): pMsg(msg) { } }; main { cC c("HELLo"); std::cout<<c.pMsg; } Мне кажется Этот код неверен. хотя все работает стабильно!
1. теоретически 4 это непосредственно константа, не хранимая как данные, только используемая как immediate const в коде, но фактически и она имеет свой адрес, хотя никто так не делает, а зря 2. вроде нормально.
№2 есть пример в библиотеке с++. на примере exception. Вот. но не понятно тот факт что переменная "HELLo" является временной и хранится в стеке. по логике как только конструктор отработал ее теоретически нет. однако когда делаем throw exception("HELLo"); мы управление получаем в другой участок кода. и там к ней есть доступ!!??
// проинициализированная строка что это значит, она хранится по особому. а кто ее удаляет? и как он знает когда ее удалять? ведь сборщика мусора неТТТ!
2 полностью корректен. Только вот public: public: явно от явы или шарпа 1. константная ссылка.. Вообще, 4 - это rvalue и у неё адреса нет. Но С++ имеет возможность применения к выражению (rvalue) операции взятия адреса, т.е. "&e". В этом случае используется временный объект. То же самое и с константными ссылками: создаётся временный объект, но он не модифицируется, поэтому значение 4 может быть "временным объектом". С другой стороны, если ссылка была бы не константная, то ссылка на 4 не имела бы смысла, т.к. модифицировать нечего.
Да никто и не удаляет. Она находится в секции PE-файла, а во всех выражениях используется адрес этой строки. Если посмотреть экзешник в тесктовом редакторе, то эту строку можно легко найти. Или ты о другом?
Тем не менее, из "другого участка кода", то есть из обработчика исключений, доступен контекст функции, вызвавшей исключение, соответственно, и есть доступ к стеку. А в нём твой cC.
//Да никто и не удаляет. Она находится в секции PE-файла, а во всех выражениях //используется адрес этой строки. Если посмотреть экзешник в тесктовом редакторе, то эту //строку можно легко найти. Так может там и 4 валяется из 1го примера?
С четырьмя все гораздо проще. Четверка является частью инструкции, immediate operand для команды "push 4"