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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Передача анонимных объектов по константн  (Прочитано 15689 раз)
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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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.038 секунд. Запросов: 20.