2016-03-16 3 views
3

Я уверен, мне не хватает простой вещи здесь,Невозможно вызвать конструктор копирования

Я не не в состоянии вызвать конструктор копирования в коде. В чем причина?

Является ли компилятор оптимизирующим мой код?

#include<iostream> 
using namespace std; 

class Test 
{ 
public: 
int x; 
Test(){ 
    x=100; 
    cout << "Test() Called\n"; 
    } 
Test(const Test &t) { 
    this->x=t.x; 
    cout << "Test-Copy() Called\n"; 
    } 

    }; 

Test fun() 
{ 
    cout << "fun() Called\n"; 
    Test t; 
    return t; 
} 

int main() 
{ 
    Test t1; 
    Test t2 = fun(); 
    cout<<t2.x<<endl; 
    return 0; 
} 
+0

RVO - оптимизация возвращаемого значения. Функция 'fun()' возвращает временное значение rvalue и, следовательно, возможно, компилятор вызывает конструктор перемещения вместо конструктора копирования. – Vishal

+0

не конструктор перемещения, я попытался переместить конструктор –

+0

@Vishal, когда происходит RVO, не вызывается ни движение, ни конструктор копирования. Кроме того, не существует неявного механизма перемещения, потому что есть объявленный пользователем конструктор копирования. –

ответ

4

Составители могут опустить авторскими и двигаться-конструкторы класса объектов, даже если копировать/конструктор двигаться и деструктор имеют наблюдаемые побочные эффекты. Это называется копированием.

Одним из таких condition является:

Если функция возвращает тип класса по значению, и выражение в заявлении Возвратимся это имя энергонезависимую объекта с автоматической продолжительности хранения, которая не является параметром функции или параметром catch catch и который имеет тот же тип (без учета cv-qualification верхнего уровня) в качестве возвращаемого типа функции, то copy/move опущен. Когда этот локальный объект сконструирован, он составляет , сконструированный непосредственно в хранилище, где в противном случае возвращаемое значение функции было бы перемещено или скопировано в. Этот вариант копирования - , известный как NRVO, «именованная оптимизация возвращаемого значения».

Если вы хотите принудительно вызвать конструктор копирования, явное нарушение одного из условий, указанных выше.

+1

Другим вариантом может быть использование коммутатора компилятора для отключения разрешения на копирование, например. gcc имеет '-fno-elide-constructors' –

+0

@ M.M Спасибо. Ваш комментарий завершает ответ. –

+0

Спасибо, мохит, это очищает мои сомнения :). Я также получил некоторую помощь от http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization –