2016-03-23 3 views
0

У меня есть класс AПочему C++ генерирует конструктор в следующем случае?

struct A{ 
    A(){} 

    A(int x): d(x) {} 

    A(const A& a): d(a.d) { 
     std::cout << "copy construction" << std::endl; 
    } 

    A(A&& a): d(a.d){ 
     std::cout << "move construction" << std::endl; 
    } 

    A& operator=(const A& a){ 
     std::cout << "copy assignment" << std::endl; 
     d = a.d; 
     return *this; 
    } 

    A& operator=(A&& a){ 
     std::cout << "move assignment" << std::endl; 
     d = a.d; 
     return *this; 
    } 

    int d; 
}; 

и функции FUNC

A func(){ 
    return A(3); 
} 

если я сделаю это

A x; 
x = func(); 

выход "присваивание движение", как и ожидалось , но если я построить A, подобный этому

A x = func(); 

тогда ничего не печатается, как если бы C++ генерировал свой собственный конструктор перемещения и отказывается использовать определенный.

Я использую Visual Studio 14

Я бы очень хотел, чтобы это понять.

Благодарим за разъяснения.

ответ

4

Выполняется вызов конструктора.

  • С помощью gcc вы можете отключить его с помощью -fno-elide-constructors.
  • msvc не имеет эквивалентной опции.
+0

Ницца и простота. – erip

+0

Выполнено как в объединенном? Или вообще опущен как часть оптимизации компилятора? – CinCout

+0

hm ok Я не знал этого поведения – bakkaa

Смежные вопросы