Когда инициализатор члена используется в классе, у которого есть конструктор перемещения, конструктор инициализированного члена вызывается при перемещении окружающего класса. Почему это происходит? Пожалуйста, предоставьте ссылки на стандарт. У меня есть предположение относительно того, что происходит, с примерами, приведенными ниже.
Кроме того, в немного другом сценарии, почему конструктор элемента не вызывается, если инициализированный элемент имеет тип данных old-old-data?
Кроме того, каковы лучшие практики в отношении инициализаторов элементов и конструкторов перемещения?
#include <bits/stdc++.h>
using namespace std;
struct C {
void do_stuff(){cout<<"stuff";}
C(){cout<<"C ctor"<<endl;}
~C(){cout<<"C DTOR"<<endl;}
};
struct Foo {
ifdef MEMBER_INIT
Foo() {cout<<"Foo ctor"<<endl;};
#else
Foo() : ptr(new C) {cout<<"Foo ctor"<<endl;};
#endif
Foo(Foo &) = delete;
Foo & operator=(Foo &) = delete;
Foo & operator=(Foo &&) = delete;
Foo(Foo && rhs){cout<<"Foo MOVE ctor"<<endl; rhs.ptr.swap(this->ptr); }
~Foo(){cout << "Foo DTOR "; if(ptr) ptr->do_stuff(); cout<<endl; }
#ifdef MEMBER_INIT
unique_ptr<C> ptr = make_unique<C>();
#else
unique_ptr<C> ptr;
#endif
};
int main()
{
Foo f;
Foo f2(move(f));
}
РЕЗУЛЬТАТЫ:
g++ -std=c++14 x.cc && ./a.out
C ctor
Foo ctor
Foo MOVE ctor
Foo DTOR stuff
C DTOR
Foo DTOR
g++ -DMEMBER_INIT -std=c++14 x.cc && ./a.out
C ctor
Foo ctor
C ctor
Foo MOVE ctor
Foo DTOR stuff
C DTOR
Foo DTOR stuff
C DTOR
Почему использование инициализатора члена вызывает другой вызов конструктора для C?
Почему при использовании инициализатора члена деструктор Foo запускает C-> do_stuff ()?
Моя задача состоит в том, чтобы инициализаторы членов оценивались для ВСЕХ типов конструктора до запуска фактического конструктора (в данном случае конструктора перемещения). Это правильно?
Я бы хотел, чтобы в стандарте были ссылки, которые подтверждают или противоречат моему предположению.