powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Visual Stuido - как запретить использовать конструктор перемещения
54 сообщений из 54, показаны все 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
Visual Stuido - как запретить использовать конструктор перемещения
    #38826678
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly Moskovskyсинтаксиса инициализации дефолтным конструктором нет
egorychубери конструктор
Эта... Я чего-то не понимаю: нет синтаксиса инициализации несуществующим конструктором?..
если у тебя в классе нет ни одного конструктора, то компилятор тебе создаст конструктор по умолчанию... но в нём POD-данные не будут инициализированы, такая вот фигня ))
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826680
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭта... Я чего-то не понимаю: нет синтаксиса инициализации несуществующим конструктором?..
Вообще это называется default initialization (инициализация по умолчанию). Слово конструктор там лишнее.
Для синтаксиса
Код: plaintext
1.
Foo c;

инициализация по умолчанию производится путем вызова конструктора, при условии что у класса или его полей есть конструкторы, т.е. только для не-POD.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826685
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и для полноты картины:
для синтаксиса
Код: plaintext
1.
Foo c = Foo();


инициализация по умолчанию производится путем вызова конструктора для не-POD или нулями для POD.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826689
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНу и для полноты картины:
для синтаксиса
Код: plaintext
1.
Foo c = Foo();

инициализация по умолчанию производится путем вызова конструктора для не-POD или нулями для POD.а в С++11 это будет работать, или надо переписывать?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826692
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Конечно будет, все обратно совместимо.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826701
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyegorych,

Конечно будет, все обратно совместимо.спасибо ))
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826702
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще нюансы (но все укладывается в вышесказанное).
Запощу пару примеров :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
struct S
{
    int a;
    string s;
};
S s = S(); // s.a == 0
S s; // s.a == мусор

struct S
{
    int a;
    string s;
    S() {}
};
S s = S(); // s.a == мусор
S s; // s.a == мусор
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826705
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чёрт, слишком стар я для этих подвыподвертов... Лучше уж останусь у одскульного "всё, что
не инициализировано явно - не инициализировано вообще".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826706
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧёрт, слишком стар я для этих подвыподвертов... Лучше уж останусь у одскульного "всё, что
не инициализировано явно - не инициализировано вообще".
+1, так проще, и правильней
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826709
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++11 все на самом деле проще :)

Код: plaintext
1.
2.
3.
4.
5.
struct S
{
    int a = 10;
    string s;
};


И все инициализируется всегда :)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826837
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MozokAnatoly 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-конструктора просто не будет.



По крайней мере, в VS такой подход не работает.
Move-ctor генерится автоматически.
Студия не позволяет его не использовать (если считает, что он нужен) :)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826839
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikПо крайней мере, в VS такой подход не работает.
Move-ctor генерится автоматически.
Студия не позволяет его не использовать (если считает, что он нужен) :)
Т.е. если вы объявляете move-к-тор, то он вызывается (и это подтвержается отладочной печатью)?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826843
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky

Перепроверил - нет, почему-то move-ctor не вызывается (но и без него не хочет рабоать)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826844
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikПерепроверил - нет, почему-то move-ctor не вызывается (но и без него не хочет рабоать)
Теперь осталось выяснить что такое "не хочет работать".
Как вы определяете что не работает?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826845
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь это выглядит совершенно бредово:)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826846
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В вашем коде из-за RVO может вообще не требоваться копирование.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826847
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[img=]
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826848
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826849
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда возникает вопрос, почему не компилит совершенно тривиальный код, ведь достаточно вызвать обычный конструктор копирования.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826850
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchik,

Потому что private функции недоступны извне класса :)
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826851
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласно стандарту, при проведении оптимизаций компилятор дожен выдавать ошибки, которые были бы если бы оптимизации не было.
В частности без RVO было бы копирование перемещением из временной переменной, а оно у вас private
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826852
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это понятно, но если удалить move-ctor, обычный copy-ctor всё равно не вызывается.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826853
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, вам надо удалить move-ctor и все.
При этом в зависимости от оптимизаций либо будет вызываться copy-ctor либо ничего.
Никакой move-ctor не генерится если объявлен copy-ctor.
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826854
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikЭто понятно, но если удалить move-ctor, обычный copy-ctor всё равно не вызывается.
Я же вам написал - это оптимизация RVO
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38826855
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, спасибо!
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38827230
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchikНе помогает:

Error C2280: 'Foo::Foo(Foo &&)' : attempting to reference a deleted function


как же не помогает, когда помогает?
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38827527
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv

Я имел в виду, что move-ctor всё равно вызывался.
Оказалось, я был не прав, это RVO (который вроде как нельзя отключить:) )
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38827540
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tolyanchik,

Если вам надо отладить конструктор копирования, то заставьте компилятор его вызвать :)
Код: plaintext
1.
2.
Foo c1;
Foo c2 = c1;


Потому что RVO не всегда будет срабатывать, а ждать когда случайно вызовется неотлаженный код это ...
...
Рейтинг: 0 / 0
Visual Stuido - как запретить использовать конструктор перемещения
    #38829263
tolyanchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

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


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