Форум программистов, компьютерный форум CyberForum.ru

Отсутствует перемещаемый конструктор в потоках - C++

Восстановить пароль Регистрация
 
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.09.2012, 21:52     Отсутствует перемещаемый конструктор в потоках #1
Добрый день.

Отвечая на вопрос в одной теме столкнулся с тем, что g++ отказался перемещать поток, ссылаясь на то, что, мол, используется удаленный конструктор копирования по константной ссылке.

C++
1
2
3
4
5
6
7
8
#include <fstream>
#include <utility>
 
int main()
{
    std::ifstream f0;
    std::ifstream f1(std::move(f0));
}
Bash
1
2
3
4
5
6
7
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i686-pc-linux-gnu/4.8.0/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ./configure
Thread model: posix
gcc version 4.8.0 20120729 (experimental) (GCC)
log
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
main.cpp: In function ‘int main()’:
main.cpp:7:35: error: use of deleted function ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’
     std::ifstream f1(std::move(f0));
                                   ^
In file included from main.cpp:1:0:
/usr/local/include/c++/4.8.0/fstream:429:11: note: ‘std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)’ is implicitly deleted because the default definition would be ill-formed:
     class basic_ifstream : public basic_istream<_CharT, _Traits>
           ^
/usr/local/include/c++/4.8.0/fstream:429:11: error: use of deleted function ‘std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)’
In file included from /usr/local/include/c++/4.8.0/fstream:40:0,
                 from main.cpp:1:
/usr/local/include/c++/4.8.0/istream:60:11: note: ‘std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)’ is implicitly deleted because the default definition would be ill-formed:
     class basic_istream : virtual public basic_ios<_CharT, _Traits>
           ^
/usr/local/include/c++/4.8.0/istream:60:11: error: use of deleted function ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’
In file included from /usr/local/include/c++/4.8.0/ios:45:0,
                 from /usr/local/include/c++/4.8.0/istream:40,
                 from /usr/local/include/c++/4.8.0/fstream:40,
                 from main.cpp:1:
/usr/local/include/c++/4.8.0/bits/basic_ios.h:68:11: note: ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’ is implicitly deleted because the default definition would be ill-formed:
     class basic_ios : public ios_base
           ^
In file included from /usr/local/include/c++/4.8.0/ios:43:0,
                 from /usr/local/include/c++/4.8.0/istream:40,
                 from /usr/local/include/c++/4.8.0/fstream:40,
                 from main.cpp:1:
/usr/local/include/c++/4.8.0/bits/ios_base.h:788:5: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
     ios_base(const ios_base&);
     ^
In file included from /usr/local/include/c++/4.8.0/ios:45:0,
                 from /usr/local/include/c++/4.8.0/istream:40,
                 from /usr/local/include/c++/4.8.0/fstream:40,
                 from main.cpp:1:
/usr/local/include/c++/4.8.0/bits/basic_ios.h:68:11: error: within this context
     class basic_ios : public ios_base
           ^
In file included from main.cpp:1:0:
/usr/local/include/c++/4.8.0/fstream:429:11: error: use of deleted function ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’
     class basic_ifstream : public basic_istream<_CharT, _Traits>
           ^
/usr/local/include/c++/4.8.0/fstream:429:11: error: use of deleted function ‘std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)/usr/local/include/c++/4.8.0/fstream:74:11: note: ‘std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)’ is implicitly deleted because the default definition would be ill-formed:
     class basic_filebuf : public basic_streambuf<_CharT, _Traits>
           ^
In file included from /usr/local/include/c++/4.8.0/ios:44:0,
                 from /usr/local/include/c++/4.8.0/istream:40,
                 from /usr/local/include/c++/4.8.0/fstream:40,
                 from main.cpp:1:
/usr/local/include/c++/4.8.0/streambuf:804:7: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const __streambuf_type&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]’ is private
       basic_streambuf(const __streambuf_type& __sb)
       ^
In file included from main.cpp:1:0:
/usr/local/include/c++/4.8.0/fstream:74:11: error: within this context
     class basic_filebuf : public basic_streambuf<_CharT, _Traits>
           ^

Кому лень компилировать линк

Параграф стандарта - 27.9.1.7.

Где я ошибся?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2012, 21:52     Отсутствует перемещаемый конструктор в потоках
Посмотрите здесь:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
C++ Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
Конструктор инициализации, конструктор копирования, деструктор C++
C++ Конструктор производного класса требует конструктор предка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
22.09.2012, 22:08     Отсутствует перемещаемый конструктор в потоках #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Следует делать так

C++
1
2
3
4
5
6
7
8
9
#include <fstream>
#include <utility>
#include <memory>
 
int main()
{
    std::unique_ptr <std::ifstream> f0(new std::ifstream);
    std::unique_ptr <std::ifstream> f1(std::move(f0));
}
или же возможен вариант

C++
1
2
3
4
5
6
7
8
9
#include <fstream>
#include <utility>
#include <memory>
 
int main()
{
    std::ifstream f0;
    std::ifstream &&f1(std::move(f0));
}
http://liveworkspace.org/code/a8831b...8c3cfbf528cc5d
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.09.2012, 22:19     Отсутствует перемещаемый конструктор в потоках #3
однако 10 студия компилит. вызов приходит в правильный конструктор:
C++
1
2
3
4
5
    basic_ifstream(_Myt&& _Right)
        : _Mybase(&_Filebuffer)
        {   // construct by moving _Right
        _Assign_rv(_STD forward<_Myt>(_Right));
        }
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.09.2012, 22:21  [ТС]     Отсутствует перемещаемый конструктор в потоках #4
А почему мой вариант некорректен?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.09.2012, 22:25     Отсутствует перемещаемый конструктор в потоках #5
надо на реализацию стримов смотреть. если нет конструктора с &&, то все логично. а вот почему нет и должен ли быть - это уже другой вопрос. ответа я не знаю.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
22.09.2012, 22:31  [ТС]     Отсутствует перемещаемый конструктор в потоках #6
DU, я поискал, перед тем, как спросить на форуме. Не нашел. Но, судя по стандарту, должн быть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2012, 22:36     Отсутствует перемещаемый конструктор в потоках
Еще ссылки по теме:

Конструктор класса не видит конструктор по умолчанию другого класса C++
C++ Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
22.09.2012, 22:36     Отсутствует перемещаемый конструктор в потоках #7
Причина в том, что в студии более "прямо" реализованы некоторые конструкции, к примеру конструктор, который предусматривает подобные манипуляции. gcc же, принимает lvalue вместо необходимого rvalue и соответственно вызывается "не то, что надо".
Как обойти такие ситуации я показал выше.
Yandex
Объявления
22.09.2012, 22:36     Отсутствует перемещаемый конструктор в потоках
Ответ Создать тему
Опции темы

Текущее время: 06:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru