Russian Qt Forum
Ноябрь 22, 2024, 18:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: const char *&  (Прочитано 22343 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #15 : Декабрь 05, 2016, 14:04 »

Код
C++ (Qt)
Object * obj = new Object;
Object & ref = *obj;
..
delete obj;   // ref is not longer valid
 
Если это "It is the object" то какого ж <template> он стал invalid?  


Следуя вашей логике можно сделать и
Код
C++ (Qt)
Object obj;
memset(&obj, 0, 100500);
А потом возмущаться:
Цитировать
может они не так уж умны?  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #16 : Декабрь 05, 2016, 14:45 »

не нужно думать о ссылке как об адресе в памяти или указателе.
Согласен.
Покопался в стандарте
Цитировать
8.3.2 References
...
4 It is unspecified whether or not a reference requires storage
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #17 : Декабрь 05, 2016, 14:52 »

В 17х плюсах возможно можно будет перегружать оператор. и делать свои ссылки. Как организовать сторадж - это вопрос 10й
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Декабрь 05, 2016, 14:57 »

Указатель =  адрес памяти, в которой хранится адрес объекта
Это уже "указатель на указатель" (**)

Как это компилятором на текущий момент реализовано - совершенно не важно и может со временем изменяться. В каких-нибудь оптимизациях это может и не через указатель делаться.
Вы правда в это верите?  Улыбающийся

Поэтому не нужно думать ..
Не нужно повторять чужое не осмыслив его. Не нужно наивно полагать что здесь кто-либо не читал хотя бы с десяток ссылок типа той что Вы привели. Ваши пояснения хороши для нерадивых студентов, а по жизни многие (включая меня) предпочитают думать о ссылке как о "замаскированном указателе" - и в этом есть резон. Для "самого объекта" время жизни всегда однозначно определено, для ссылки неизвестно.

Следуя вашей логике можно сделать и
Код
C++ (Qt)
Object obj;
memset(&obj, 0, 100500);
Это не следует моей логике, Вы портите содержимое объекта, но сам объект существует, напр  по-прежнему можно обращаться к его членам, пусть там и нули.  

Согласен.
Покопался в стандарте
Цитировать
8.3.2 References
...
4 It is unspecified whether or not a reference requires storage
Это значит что "замаскированный указатель" может храниться и на регистрах

Однако ж мы отвлеклись от темы. Как всегда, все проблемы легко решаются если убрать const, но это все-таки не очень хорошо, в ф-ции Test все к месту. По-моему лучше всего явно привестись в вызывающем
Код
C++ (Qt)
void Test( const char *& src )
{
}
 
int main()
{
char * test = new char[128];
Test((const char *&) test);
return 0;
}
Или нет-нет, "так низзя" Непонимающий Тогда как иначе?
« Последнее редактирование: Декабрь 05, 2016, 15:06 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #19 : Декабрь 05, 2016, 15:05 »

Указатель =  адрес памяти, в которой хранится адрес объекта
Это уже "указатель на указатель" (**)
Рекомендую неплохую книжку, которая даст понимание отличия указателя от адреса https://www.ozon.ru/context/detail/id/28277147/.

По основной проблеме:
Вы можете завести const char * переменную и передавать её в вашу функцию.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #20 : Декабрь 05, 2016, 15:06 »

Судя по ошибкам компилятора, полагаю, что в результате неявного преобразования char * в const char * мы получаем rvalue, от которого по стандарту нельзя брать неконстантную ссылку.

Да, вы правы, а я нет:

Код:
typedef char * Ptr;
typedef const char * CPtr;

void Test( const CPtr & src ) {}

int main(int argc, char *argv[])
{
    Ptr src;
    Test(src); // ok
    return 0;
}
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #21 : Декабрь 05, 2016, 15:17 »


Однако ж мы отвлеклись от темы. Как всегда, все проблемы легко решаются если убрать const, но это все-таки не очень хорошо, в ф-ции Test все к месту. По-моему лучше всего явно привестись в вызывающем

Ну только, раз уж на плюсах пишем:
Код
C++ (Qt)
 
int main()
{
char * test = new char[128];
Test(const_cast<const char *&>(test));
return 0;
}

Этот неловкий момент, когда констнантность навешивается, а не убирается.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Декабрь 05, 2016, 15:24 »

Код:
typedef char * Ptr;
typedef const char * CPtr;

void Test( const CPtr & src ) {}

int main(int argc, char *argv[])
{
    Ptr src;
    Test(src); // ok
    return 0;
}
Так мне не нужна константная ссылка в Test, я затем ссылку и объявил чтобы src менять в ф-ции

По основной проблеме:
Вы можете завести const char * переменную и передавать её в вашу функцию.
Это оглашено в стартовом посте, что еще?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Декабрь 05, 2016, 15:32 »

В общем, как я понял
Код
C++ (Qt)
void Test( const char *& src );
 
Это НЕконстантная ссылка (на указатель на константу), а значит в момент создания (связывания) ссылки исходный объект точно такого же типа (const char *) должен существовать (lvalue), чтобы он имел адрес. Так или нет?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #24 : Декабрь 05, 2016, 15:32 »

Нет. В первом посте оглашено немного другое.

Код
C++ (Qt)
void Test( const char *& src )
{
}
 
int main()
{
char * test = new char[128];
const char * testConst = test;
Test(testConst );
return 0;
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #25 : Декабрь 05, 2016, 15:33 »

В общем, как я понял
Код
C++ (Qt)
void Test( const char *& src );
 
Это НЕконстантная ссылка (на указатель на константу), а значит в момент создания (связывания) ссылки исходный объект точно такого же типа (const char *) должен существовать (lvalue), чтобы он имел адрес. Так или нет?
да
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #26 : Декабрь 06, 2016, 13:32 »

Согласен.
Покопался в стандарте
Цитировать
8.3.2 References
...
4 It is unspecified whether or not a reference requires storage
Это значит что "замаскированный указатель" может храниться и на регистрах

Это значит, что не определено, требуется или нет память под хранение ссылки. Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Декабрь 06, 2016, 13:54 »

Это значит, что не определено, требуется или нет память под хранение ссылки. Подмигивающий
А если не требуется то где же хранить?  Улыбающийся

Кстати Ваше предыдущее "уточнение" тоже было не совсем удачным
Нет. В первом посте оглашено немного другое.

Код
C++ (Qt)
void Test( const char *& src )
{
}
 
int main()
{
char * test = new char[128];
const char * testConst = test;
Test(testConst );
return 0;
}
Да, это скомпилится, но как с этим работать? Мне-то нужно чтобы Test продвигала (меняла) указатель test. А получив testConst что с ним делать?
Код
C++ (Qt)
test = const_cast<char *> (testConst);
Ну как-то совсем кисло, особенно если вызовов Test много
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #28 : Декабрь 06, 2016, 14:07 »

Да, это скомпилится, но как с этим работать? Мне-то нужно чтобы Test продвигала (меняла) указатель test. А получив testConst что с ним делать?
Указатель можно будет спокойно двигать, а вот изменить данные по указателю не получиться, вы сами туда const поставили.
Код
C++ (Qt)
void Test( const char *& src )
{
cout << *src++ << endl;
cout << *src++ << endl;
}
 
Так что уточнение было удачным, это вы что-то опять в букваре не дочитали. Улыбающийся

Ф-ция принимает указатель на константу, сам указатель менять можно, данные по нему - нет. Я этого и хотел, но еще и чтобы сам указатель менялся когда ф-ция отдала упр-е. Напр прочитал слово из строки и продвинул указатель на следующее слово.
« Последнее редактирование: Декабрь 06, 2016, 14:13 от Old » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #29 : Декабрь 06, 2016, 14:29 »

А если не требуется то где же хранить?  Улыбающийся
Что за тавтология. Если память под хранение не требуется, то и хранить не где, а в операциях подставляем адрес объекта, на который ссылаемся.

Насчёт моего примера, если честно, то я не совсем представляю, где приведённая в #1 конструкция может применяться, не сталкивался, может поведаете, что делает ваша Test?. Вы как-то хотите и вишенку съесть и Ж@#% не ободрать Улыбающийся . Я бы даже немного перебрал сигнатуру:
Код
C++ (Qt)
const char *Test(const char*)
А лично вам могу посоветовать снять константность с возвращаемого значения Улыбающийся
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.532 секунд. Запросов: 23.