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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Передача анонимных объектов по константн  (Прочитано 14799 раз)
vizir.vs
Гость
« : Декабрь 05, 2014, 12:53 »

Доброго дня.
Есть следующий код:
Код:
#include <iostream>

class A
{
public:
A() {a = new int(5);
std::cout << "const " << a << std::endl;}
int* getA() const {return a;}
~A(){delete a;}

private:
A(const A&){}
int* a;
};

void f(const A& a)
{
std::cout << *a.getA() << std::endl;
}

int main()
{
f(A());
return 0;
}

MinGW утверждает что в f(A()) ему понадобиться конструктор копирования (!!!) и выдает ошибку компиляции. Почему? Эксперименты показали, что на деле конструктор копирования вызывать он не будет (Это можно глянуть, если конструктор копирования вынести в public и добавить вывод в него).

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

Сообщений: 5876


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


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

А если так:
Код
C++ (Qt)
A a;
f(a);
 
?
Записан

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

Сообщений: 5876


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


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

Да, A(const A&){} тут реализация не нужна, то есть, A(const A&);
И раз запрещаешь копирующий конструктор, то запрещай и оператор присваивания.
Записан

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

Сообщений: 11445


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

MSVC это пропускает, а в др компиляторах то же самое - конструктор копирования не должен быть private. Наверное дело в том что константная ссылка разрешает копирование (неважно будет ли оно на самом деле)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

MSVC это пропускает, а в др компиляторах то же самое - конструктор копирования не должен быть private. Наверное дело в том что константная ссылка разрешает копирование (неважно будет ли оно на самом деле)
С каких это пор он не должен быть private??? Посмотри Кьютишные реализации - там во всю юзается макрос Q_DISABLE_COPY. И константной ссылке не нужно копирование.
Записан

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

Сообщений: 2812


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

Цитировать
MSVC это пропускает

Оно много чего пропускает.. Вот, недавно хотел перевести некий проект на MinGW - а оно ппц.. не дает.. Там столько кода говна что разгребать и разгребать.. И да - студия расслабляет. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
vizir.vs
Гость
« Ответ #6 : Декабрь 05, 2014, 14:14 »

А если так:
Код
C++ (Qt)
A a;
f(a);
 
?
Так работает. Все компилиться.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

А что за компиль у тебя?
Записан

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

Да, A(const A&){} тут реализация не нужна, то есть, A(const A&);
И раз запрещаешь копирующий конструктор, то запрещай и оператор присваивания.
Это да, оператор тоже надо запрещать. Я обычно использую boost::noncopyable. В данном случае оператор присваивания не играл ни какой роли.
Записан
vizir.vs
Гость
« Ответ #9 : Декабрь 05, 2014, 14:17 »

А что за компиль у тебя?
c:\test>c++ -v
Reading specs from C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/specs
Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.5 (mingw-vista special r3)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

Ого, какое гавно мамонта. А почему на 4 не перейдешь?
Записан

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

MSVC это пропускает, а в др компиляторах то же самое - конструктор копирования не должен быть private. Наверное дело в том что константная ссылка разрешает копирование (неважно будет ли оно на самом деле)
Конструктор копирования должен быть private. Вопрос, какого фига компилятор (скорее семантический анализатор) требует конструктор копирования, если он его вообще не использует.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

Скорее всего, тут A() воспринимается как временный объект и делается попытка его скопировать, чтобы отдать корректную ссылку. Может, бага компилятора?
Записан

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

Ого, какое гавно мамонта. А почему на 4 не перейдешь?
В свое время скачал Qt4.8.1 и там этот мингв был в поставке + собран под него. Менять в падлу, это возможно еще и boost перекомпилять, и еще пара библиотек. Ну его нафиг. К тому же под винду я очень редко пишу, в основном все под unix системы, а винда так...
Записан
vizir.vs
Гость
« Ответ #14 : Декабрь 05, 2014, 14:25 »

Скорее всего, тут A() воспринимается как временный объект и делается попытка его скопировать, чтобы отдать корректную ссылку. Может, бага компилятора?
В том то и дело, что если добавить вывод в конструктор копирования или в конструктор, то можно увидеть, что копирования не происходит. К тому же я понял бы, если бы требовался конструктор копирования для не константной ссылки. Для константной ссылки время жизни временного объекта удлиняется и поэтому копирования вообще не имеет смысла.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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