Почему следующий код также вызывает конструктор копирования?

Почему это когда g_Fun() выполняет до return temp это будет вызывать конструктор копирования?

class CExample
{
private:
int a;

public:
CExample(int b)
{
a = b;
}

CExample(const CExample& C)
{
a = C.a;
cout<<"copy"<<endl;
}

void Show ()
{
cout<<a<<endl;
}
};

CExample g_Fun()
{
CExample temp(0);
return temp;
}

int main()
{
g_Fun();
return 0;
}

3

Решение

Потому что вы возвращаете по значению, но обратите внимание, что вызов конструктора копирования не требуется, потому что РВО.

В зависимости от уровня оптимизации, copy-ctor может или не может быть вызван — не полагайтесь ни на что.

7

Другие решения

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

CExample g_Fun()
{
return CExample(0);    //to avoid the copy constructor call
}
0