Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual Stuido - как запретить использовать конструктор перемещения / 25 сообщений из 54, страница 1 из 3
04.12.2014, 18:45
    #38825374
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Не то чтобы это было проблемой, но просто непонятно.


Если move-constructor положить в приват - не компилит.
Хотя мог бы юзать обычный copy-constructor.
Может есть опция по отключению C++11?
...
Рейтинг: 0 / 0
04.12.2014, 19:53
    #38825457
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
tolyanchik,

Объяви конструктор с соотв. сигнатурой и снабди ключевым словом "delete".

http://ru.cppreference.com/w/cpp/language/move_constructor
...
Рейтинг: 0 / 0
04.12.2014, 21:16
    #38825509
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Не помогает:

Error C2280: 'Foo::Foo(Foo &&)' : attempting to reference a deleted function
...
Рейтинг: 0 / 0
05.12.2014, 00:33
    #38825606
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
tolyanchik,

Приведите код.
...
Рейтинг: 0 / 0
05.12.2014, 00:35
    #38825609
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly Moskovsky,
Код: plaintext
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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
#include <iostream>
using namespace std;


class Foo {

	int* root;
	int size;

	public:
	
		Foo(Foo&&) = delete;


	explicit Foo(int s){

		size = s;
		root = new int[size];
	}

	int sum()const {

		int s = 0;
		for (int i = 0; i < size; i++){
				
			s += root[i];
		}

		return s;
	}

	Foo(const Foo& another){

		cout << "Copy ctor" << endl;
		size = another.size;

		root = new int[size];
		for (int i = 0; i < size; i++){

			root[i] = another.root[i];
		}
	}

	Foo& operator=(const Foo& another){

		cout << "operator=" << endl;

		if (this == &another){

			return *this;
		}

		delete[] root;

		size = another.size;

		for (int i = 0; i < size; i++){

			root[i] = another.root[i];
		}

		return *this;
	}
	~Foo(){
		cout << "dtor" << endl;
		delete[] root;
	}
};

Foo makeFoo(){

	return Foo(100);// ругается
}

int main(){

	Foo a(10);
	
	Foo c = makeFoo();

	system("pause");
	return 0;
}
...
Рейтинг: 0 / 0
05.12.2014, 00:38
    #38825610
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
...
Рейтинг: 0 / 0
05.12.2014, 01:07
    #38825617
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
tolyanchik,

В GCC тоже самое.

Пока не врубаюсь почему ошибка.
Вот сокращенный до минимума код, где повторяется ошибка, может кто-то увидит что-то очевидное.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Foo {
public:
    Foo() = default;
    Foo(Foo&&) = delete;
    Foo(const Foo& another) = default;
};

int main(){
    Foo c = Foo();
    return 0;
}
...
Рейтинг: 0 / 0
05.12.2014, 04:37
    #38825659
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly Moskovsky
Код: sql
1.
2.
3.
4.
int main(){
    Foo c = Foo();
    return 0;
}

А скажите пожалуйста, что вот этот код должен сделать?
Я тут вижу создание объекта, потом еще одно создание, потом копирование.
А что в свете новых веяний должно быть?
...
Рейтинг: 0 / 0
05.12.2014, 06:28
    #38825665
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
White Owl
Копирующего присваивания здесь нет.

Это вызов копирующего конструктора.

В с++11 может быть заменен вызовом move-конструктора, т.к. справа временный объект.
...
Рейтинг: 0 / 0
05.12.2014, 08:52
    #38825699
locked
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
похожее обсуждение на стаке How to allow copy elision construction for C++ classes
...
Рейтинг: 0 / 0
05.12.2014, 13:20
    #38826146
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
White OwlAnatoly Moskovsky
Код: sql
1.
2.
3.
4.
int main(){
    Foo c = Foo();
    return 0;
}


А скажите пожалуйста, что вот этот код должен сделать?
Я тут вижу создание объекта, потом еще одно создание, потом копирование.
Согласно стандарту (не только новому но и всем предыдущим), это инициализация объявленного объекта, а не копирование временного в объявленный.
Но компилятору никто не запрещает и создать временный объект и копировать его в объявленный.
...
Рейтинг: 0 / 0
05.12.2014, 13:36
    #38826177
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly MoskovskyСогласно стандарту (не только новому но и всем предыдущим), это
инициализация объявленного объекта, а не копирование временного в объявленный.
Но выглядит это как инициализация одного объекта другим объектом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2014, 13:52
    #38826217
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Dimitry SibiryakovAnatoly MoskovskyСогласно стандарту (не только новому но и всем предыдущим), это
инициализация объявленного объекта, а не копирование временного в объявленный.
Но выглядит это как инициализация одного объекта другим объектом.
RVO же, замучаешься его отключать, если зачем то приспичит ))
...
Рейтинг: 0 / 0
05.12.2014, 14:50
    #38826304
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly Moskovsky
Но компилятору никто не запрещает и создать временный объект и копировать его в объявленный.

Пожалуй, всё-таки нельзя.
Ну, или пусть делает это без вызова copy-assignment.
...
Рейтинг: 0 / 0
05.12.2014, 15:43
    #38826366
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Вот единственное, что хочется сказать: "понапридумывали"
...
Рейтинг: 0 / 0
05.12.2014, 18:11
    #38826560
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения

Классик

Уважаемый редактор
Может лучше про реактор?
Про привычный лунный трактор!
Ведь нельзя-же всё подряд!
То тарелками пугають!
Дескыть подлые летають!
То у вас собаки лають.
То руины говорят...
...
Рейтинг: 0 / 0
05.12.2014, 19:00
    #38826611
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Dimitry SibiryakovНо выглядит это как инициализация одного объекта другим объектом.
Дело в том что другого синтаксиса инициализации дефолтным конструктором нет (точнее не было до C++11) :)
Код: plaintext
1.
2.
3.
4.
Foo c(); // так нельзя
Foo c; // а так не совсем то (для POD инициализация не проводится) 
Foo c = Foo(); // до c++11
Foo c{}; // c++11
...
Рейтинг: 0 / 0
05.12.2014, 19:06
    #38826615
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Возвращаясь к исходному вопросу.
Раз в GCC то же самое, то скорее всего такое поведение описано в стандарте (но я сам не искал где, т.к. нет времени).
Раз такие дела, то просто реализуйте move-конструктор :)
Никаких причин против использования move-конструкторов я не вижу.
...
Рейтинг: 0 / 0
05.12.2014, 19:07
    #38826617
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly MoskovskyDimitry SibiryakovНо выглядит это как инициализация одного объекта другим объектом.
Дело в том что другого синтаксиса инициализации дефолтным конструктором нет (точнее не было до C++11) :)
Код: plaintext
1.
2.
3.
4.
Foo c(); // так нельзя
Foo c; // а так не совсем то (для POD инициализация не проводится) 
Foo c = Foo(); // до c++11
Foo c{}; // c++11

это чтож, весь старый код будет давать такой замечательный бэкграунд при переходе на С++11?
...
Рейтинг: 0 / 0
05.12.2014, 19:19
    #38826627
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
egorychэто чтож, весь старый код будет давать такой замечательный бэкграунд при переходе на С++11?
Получается, что если были copy-конструкторы, то надо реализовать и move-конструкторы, иначе будет использован дефолтный.
Фигня какая-то.
Надо почитать стандарт.
Сам я пока на с++11 не пишу, поэтому не сталкивался с этой темой.
...
Рейтинг: 0 / 0
05.12.2014, 20:32
    #38826658
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly Moskovsky
Код: sql
1.
Foo c; // а так не совсем то (для POD инициализация не проводится)


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <stdio.h>

struct Foo
{
	int a;
	Foo(): a(222) {}
};

int main()
{
  Foo c;
  printf("a=%d\n", c.a);
  return 0;
}


Что я делаю неправильно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2014, 20:33
    #38826659
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly MoskovskyПолучается, что если были copy-конструкторы, то надо реализовать и move-конструкторы, иначе будет использован дефолтный.
Фигня какая-то.
Надо почитать стандарт.
Сам я пока на с++11 не пишу, поэтому не сталкивался с этой темой.
Не-а, не будет:
ISO C++If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared
as defaulted if and only if
— X does not have a user-declared copy constructor,
— X does not have a user-declared copy assignment operator,
— X does not have a user-declared move assignment operator,
— X does not have a user-declared destructor, and
— the move constructor would not be implicitly defined as deleted.
[ Note: When the move constructor is not implicitly declared or explicitly supplied, expressions that otherwise
would have invoked the move constructor may instead invoke a copy constructor. —end note ]
То есть, tolyanchik'у достаточно убрать
Код: plaintext
1.
	Foo(Foo&&) = delete;


И никакого move-конструктора просто не будет.
...
Рейтинг: 0 / 0
05.12.2014, 20:44
    #38826666
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Dimitry SibiryakovЧто я делаю неправильно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <stdio.h>

struct Foo
{
	int a;
	Foo(): a(222) {} // это не POD
};

int main()
{
  Foo c;
  printf("a=%d\n", c.a);
  return 0;
}

убери конструктор, собери в релизе, наслаждайся ))
...
Рейтинг: 0 / 0
05.12.2014, 20:48
    #38826667
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
Anatoly Moskovskyсинтаксиса инициализации дефолтным конструктором нет
egorychубери конструктор
Эта... Я чего-то не понимаю: нет синтаксиса инициализации несуществующим конструктором?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2014, 21:12
    #38826675
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Visual Stuido - как запретить использовать конструктор перемещения
MozokТо есть, tolyanchik'у достаточно убрать
Код: plaintext
1.
	Foo(Foo&&) = delete;



И никакого move-конструктора просто не будет.
Я примерно так и предполагал, но не видел что это работает.
А теперь понял почему.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Foo {
public:
    Foo() = default;
    Foo(const Foo&)  { cout << "Foo(const Foo&)" << endl;}
};

int main(){
    Foo c = Foo();
    return 0;
}


Тут я не видел вызова copy-ctor и думал что вместо него вызывался неявный move-ctor, а на самом деле тут просто ни copy-ctor ни move-ctor не вызываются, потому что есть только инициализация Foo() и никакого копирования вообще не происходит, как я выше сам и объяснял :)

Таким образом действительно достаточно не объявлять move-ctor вообще, но объявить copy-ctor.
Все, буду спать спокойно )
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual Stuido - как запретить использовать конструктор перемещения / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]