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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Передача анонимных объектов по константн  (Прочитано 14787 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


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

Цитировать
Для константной ссылки время жизни временного объекта удлиняется
На сколько я помню, это появилось только в 11 стандарте, что временный объект живет пока жива константная ссылка на него. До 11 стандарта это было сугубо поведение в конкретных компиляторах. Поищи статью Майерса по этой теме.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vizir.vs
Гость
« Ответ #16 : Декабрь 05, 2014, 14:30 »

Цитировать
Для константной ссылки время жизни временного объекта удлиняется
На сколько я помню, это появилось только в 11 стандарте, что временный объект живет пока жива константная ссылка на него. До 11 стандарта это было сугубо поведение в конкретных компиляторах. Поищи статью Майерса по этой теме.
На сколько я помню, это было еще до 11 стандарта. Нашел http://alenacpp.blogspot.ru/2008/01/const.html. Статья от 2008 года. 11 стандарта тогда еще не было.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


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

Тьфу, Саттер http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


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

1. Это не было описано в стандарте.
2. У тебя еще важная вещь - твой объект неименованный.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vizir.vs
Гость
« Ответ #19 : Декабрь 05, 2014, 14:35 »

1. Это не было описано в стандарте.
2. У тебя еще важная вещь - твой объект неименованный.
Но все равно, получается, что компилятор требует конструктор копирования, но при этом его не использует. Даже если объект уничтожиться в процессе выполнения функции, ему какое дело, что у меня нет конструктора копирования? Он же копировать не должен, это ссылка. Ссылки не копируют объект.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

С каких это пор он не должен быть private??? Посмотри Кьютишные реализации - там во всю юзается макрос Q_DISABLE_COPY. И константной ссылке не нужно копирование.
То же будет и с Qt классами, напр
Код
C++ (Qt)
void Test( const QWidget & w )
{
}
 
int main( int argc, char *argv[] )
{
Test(QPushButton("btn"));
return 0;
}
 
Цитировать
.../Headers/qpushbutton.h:116: error: 'QPushButton::QPushButton(const QPushButton&)' is private
Причем на многих компиляторах: gcc. icc, clang

Я это понимаю так
Код
C++ (Qt)
void Test( const QString & txt );
 
// 1
QString txt("abc");
Test(txt);
 
// 2
Test("abc");
 
В первом случае объект txt существует, он и используется, фактически подается его адрес. Во втором создается временный объект, QString должен иметь конструктор принимающий const char *

Возвращаясь к теме: по каким-то причинам "самостоятельно созданный временный объект" не считается "тем на что можно сослаться" и значит его надо копировать (случай 2). Хотя это и противоречит здравому смыслу  Улыбающийся
Цитировать
Больной, проснитесь и примите снотворное!
Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #21 : Декабрь 05, 2014, 16:06 »

Igors, дабы не быть голословным, приведи, пожалуйста, версии компиляторов.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


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

Заюзал clang, вот что получил
Код:
main.cpp:9:7: warning: C++98 requires an accessible copy constructor for
      class 'QPushButton' when binding a reference to a temporary; was
      private [-Wbind-to-temporary-copy]
        Test(QPushButton("btn"));


Как я и писал в самом начале, до 11 стандарта данное поведение было отдано на откуп компиляторам.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Igors, дабы не быть голословным, приведи, пожалуйста, версии компиляторов.
gcc 4.2 apple (совсем старый), icc 13.0 (где-то года 2 ему), clang помню kambala проверял с год назад, так что вполне новый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Для константной ссылки время жизни временного объекта удлиняется и поэтому копирования вообще не имеет смысла.
Не понял что куда удлиняется? Деструктор временного объекта вызовется когда ф-ция (куда его подали) вернет управление. Разве в С++ 11 что-то изменилось?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #25 : Декабрь 05, 2014, 16:21 »

Для константной ссылки время жизни временного объекта удлиняется и поэтому копирования вообще не имеет смысла.
Не понял что куда удлиняется? Деструктор временного объекта вызовется когда ф-ция (куда его подали) вернет управление. Разве в С++ 11 что-то изменилось?
Пройди по ссылке выше в топике, там Саттер на счет этого пишет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vizir.vs
Гость
« Ответ #26 : Декабрь 05, 2014, 16:46 »

Больше всего меня смущает, что копирования не происходит. Он его требует и примерно можно предположить почему. Но не использует. Зачем требовать то, что потом не используешь?!
Записан
vizir.vs
Гость
« Ответ #27 : Декабрь 05, 2014, 16:49 »

С каких это пор он не должен быть private??? Посмотри Кьютишные реализации - там во всю юзается макрос Q_DISABLE_COPY. И константной ссылке не нужно копирование.
То же будет и с Qt классами, напр
Код
C++ (Qt)
void Test( const QWidget & w )
{
}
 
int main( int argc, char *argv[] )
{
Test(QPushButton("btn"));
return 0;
}
 
Цитировать
.../Headers/qpushbutton.h:116: error: 'QPushButton::QPushButton(const QPushButton&)' is private
Причем на многих компиляторах: gcc. icc, clang

Я это понимаю так
Код
C++ (Qt)
void Test( const QString & txt );
 
// 1
QString txt("abc");
Test(txt);
 
// 2
Test("abc");
 
В первом случае объект txt существует, он и используется, фактически подается его адрес. Во втором создается временный объект, QString должен иметь конструктор принимающий const char *

Возвращаясь к теме: по каким-то причинам "самостоятельно созданный временный объект" не считается "тем на что можно сослаться" и значит его надо копировать (случай 2). Хотя это и противоречит здравому смыслу  Улыбающийся
Цитировать
Больной, проснитесь и примите снотворное!
Улыбающийся

В моем примере mingw требует конструктор копирования, а gcc нет. Код одинаковый, поведение разное.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Больше всего меня смущает, что копирования не происходит. Он его требует и примерно можно предположить почему. Но не использует. Зачем требовать то, что потом не используешь?!
А почему Вас это удивляет? Случай совсем не редкий, напр
Код
C++ (Qt)
MyClass GetA( void );
..
MyClass a = GetA();
Как Вы знаете здесь никакого копирования нет, вызывается 1 конструктор (извращения MSVC не в счет). Тем не менее также требуется конструктор копирования
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


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

1. Это не было описано в стандарте.
2. У тебя еще важная вещь - твой объект неименованный.

старый стандарт ковырять лень.
однако совершенно точно знаю, что с++03 msvc/mingw/gcc продлевали жизнь временного объекта посредством константной ссылки

И дело даже не в этом.
А в том, что взятие ссылки с объекта такого же типа никогда не вызывает приведения типов.
Соответственно, никогда не просит копирующего конструктора.

« Последнее редактирование: Декабрь 06, 2014, 00:42 от _Bers » Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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