2015-12-03 15 views
0
#include <iostream> 
using namespace std; 
class Base{ 
    int a; 
public: 
    Base(int b):a(b){cout<<"0"<<endl;} 
    Base(Base const &b):a(b.a){cout<<"1"<<endl;} 
private: 
    Base(Base &b); 
}; 
Base fun(){ 
    return 2;// 
} 
int main(){ 
    fun(); 
    return 0; 
} 

Я думаю, он будет ссылаться на базу (INT б) построить временный объект, а затем использовать Base (База константный & б), так будет COUT «0» и «1», но, как вопрос, что это только cout «0», почему?Copy конструктор не вызывается в то время как он должен быть

+2

Вы слышали о «Оптимизации стоимости»? –

+3

Кроме [RVO] (https://en.wikipedia.org/wiki/Return_value_optimization), вы также можете прочитать о [* copy elision *] (https://en.wikipedia.org/wiki/Copy_elision). –

ответ

1

Эта проблема называется copy elision: при определенных обстоятельствах компилятору разрешено копировать (или перемещать) объекты. Примечательно, что всякий раз, когда скопирован временный объект (т. Е. Объект без имени), копия может быть удалена. Компилятору также разрешено удалять копию при возврате именованного значения из функции. Это часто называют [Named] Оптимизация возвращаемого значения или NRVO.

обстоятельства, при которых копии могут быть Опущенные являются (в стандарте C++ вы можете найти подробности в разделе 12.8 пункта [class.copy] 31):

  • при копировании временной переменной
  • при возврате локальная переменная (но не аргумент функции), используя его имя
  • при метании локальной переменной (но не аргумент функции), используя его имя
  • при ловле исключение по значению

Копирование разрешения разрешено, даже если применение этой оптимизации изменяет поведение программы, т. Е. Когда конструктор копирования (или перемещения) или деструктор имеют побочные эффекты.