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


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

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

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

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

Приведите код.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38825609
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38825610
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38825617
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38825659
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: sql
1.
2.
3.
4.
int main(){
    Foo c = Foo();
    return 0;
}

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

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

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


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

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

Классик

Уважаемый редактор
Может лучше про реактор?
Про привычный лунный трактор!
Ведь нельзя-же всё подряд!
То тарелками пугають!
Дескыть подлые летають!
То у вас собаки лають.
То руины говорят...
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826611
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38826615
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаясь к исходному вопросу.
Раз в GCC то же самое, то скорее всего такое поведение описано в стандарте (но я сам не искал где, т.к. нет времени).
Раз такие дела, то просто реализуйте move-конструктор :)
Никаких причин против использования move-конструкторов я не вижу.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826617
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38826627
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychэто чтож, весь старый код будет давать такой замечательный бэкграунд при переходе на С++11?
Получается, что если были copy-конструкторы, то надо реализовать и move-конструкторы, иначе будет использован дефолтный.
Фигня какая-то.
Надо почитать стандарт.
Сам я пока на с++11 не пишу, поэтому не сталкивался с этой темой.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38826659
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38826666
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Visual Stuido - как запретить использовать конструктор перемещения
    #38826667
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyсинтаксиса инициализации дефолтным конструктором нет
egorychубери конструктор
Эта... Я чего-то не понимаю: нет синтаксиса инициализации несуществующим конструктором?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826675
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 54, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual Stuido - как запретить использовать конструктор перемещения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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