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

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

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

Сообщений: 11445


Просмотр профиля
« : Декабрь 04, 2016, 09:21 »

Добрый день

Код
C++ (Qt)
void Test( const char *& src )
{
}
 
int main()
{
char * test = new char[128];
// const char * test = new char[128]; // Ok
Test(test);
return 0;
}
Почему это не компилится  Непонимающий

Спасибо
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Потому что так const char *& src вы описываете ссылку на константный указатель на char.
А вам надо char * const & src, т.е. константную ссылку на указатель на char.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


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

а const char & * src ?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

а const char & * src ?
Не бывает указателей на ссылку.
Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


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

>Не бывает указателей на ссылку.
Ссылка есть указатель.
Не бывает указателей на указатель.... Дожились.
Просто выглядит по другому.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

>Не бывает указателей на ссылку.
Ссылка есть указатель.
Не бывает указателей на указатель.... Дожились.
Просто выглядит по другому.
Дожили. А это что за тип?
char **val;

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

Сообщений: 11445


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

а const char & * src ?
А чего это я должен гадать?
Код
C++ (Qt)
void Test1( const char * src )
{
 ++src; // ok
 src[0] = 0; // error
}
Ф-ция принимает указатель на константу, сам указатель менять можно, данные по нему - нет. Я этого и хотел, но еще и чтобы сам указатель менялся когда ф-ция отдала упр-е. Напр прочитал слово из строки и продвинул указатель на следующее слово. Поэтому  
Код
C++ (Qt)
void Test1( const char *& src )
{
 ++src; // ok
 src[0] = 0; // error
}
Но почему вызывающий не может привести НЕконстантный указатель к константному - хз. Наверное просто "это другой тип", а ссылка должна быть "точно такого типа". Напр
Код
C++ (Qt)
typedef char * Ptr;
typedef const char * CPtr;
 
void Test( CPtr & src );
 
Ptr src;
Test(src); // error
Выходит нельзя сделать ссылку на CPtr из Ptr. Или я фантазирую?
« Последнее редактирование: Декабрь 05, 2016, 11:40 от Igors » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

Возможно, тут работает правило "1 встроенное преобразование, 1 пользовательское преобразование".
Тут встроенных преобразования 2:
1) char * -> const char *
2) const char * -> const char *&

Не уверен, правда, что это правило распространяется на ссылки.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Ссылка есть указатель.
Ссылка не есть указатель. Ссылка хранит адрес объекта. Автоматически разименовывается при использовании.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

>Не бывает указателей на ссылку.
Ссылка есть указатель.
Не бывает указателей на указатель.... Дожились.
Просто выглядит по другому.

What is a reference?
Записан

Пока сам не сделаешь...
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

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

Сообщений: 11445


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

Отак от - тыц ссылочкой, и усе Улыбающийся И что же там пишут?

Цитировать
Important note: Even though a reference is often implemented using an address in the underlying assembly language, please do not think of a reference as a funny looking pointer to an object. A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object.
А почему собсно? Изменилась "семантика" (я и такое слово знаю Улыбающийся), но "физически" все тот же махровый указатель. И знать это весьма полезно, напр
Код
C++ (Qt)
Object * obj = new Object;
Object & ref = *obj;
..
delete obj;   // ref is not longer valid
 
Если это "It is the object" то какого ж <template> он стал invalid? Так что я бы не спешил тупенько повторять "что написали умные люди" - может они не так уж умны?  Улыбающийся 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Переменная = адрес объекта
Ссылка  = адрес объекта
Указатель =  адрес памяти, в которой хранится адрес объекта
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

А почему собсно? Изменилась "семантика" (я и такое слово знаю Улыбающийся), но "физически" все тот же махровый указатель. И знать это весьма полезно, ...

Разработчики стандарта языка и компиляторов отдельно подчёркивают, что ссылка - это не указатель, и не важно, как на текущий момент это внутри реализовано. Вы же свою линию гнёте Улыбающийся.

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

Что здесь странного? Вы создали объект, через разыменование указателя получили доступ к нему и теперь можете обращаться к этому объекту через ссылку/псевдоним. Потом объект удалили, следовательно все его псевдонимы(ссылки на него) стали невалидными.

Так что я бы не спешил тупенько повторять "что написали умные люди" - может они не так уж умны?  Улыбающийся 

Тогда можете жить в своём мире, отличном от мира "умных людей" Улыбающийся.
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

Переменная = адрес объекта
Ссылка  = адрес объекта
Указатель =  адрес памяти, в которой хранится адрес объекта

Ссылка - это псевдоним объекта. Как это компилятором на текущий момент реализовано - совершенно не важно и может со временем изменяться. В каких-нибудь оптимизациях это может и не через указатель делаться. Поэтому не нужно думать о ссылке как об адресе в памяти или указателе. Это псевдоним объекта, сам объект.
Записан

Пока сам не сделаешь...
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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