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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
#1

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

22.09.2012, 21:52. Просмотров 649. Ответов 6
Метки нет (Все метки)

Добрый день.

Отвечая на вопрос в одной теме столкнулся с тем, что 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5818 / 1216 / 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
1479 / 1055 / 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
1479 / 1055 / 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     Отсутствует перемещаемый конструктор в потоках
Еще ссылки по теме:

MSVC - читаем файл в 2х потоках C++
Как в потоках вводить текст? C++
C++ 2 цикла в разных потоках
C++ Одинаковый id в двух потоках
Организовать рандом в параллельных процессах(потоках) C++

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

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

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