C ++ Здесь вызывается конструктор копирования? - PullRequest
5 голосов
/ 03 марта 2011

Предположим, у вас есть такие функции:

Foo foo() {
  Foo foo;

  // more lines of code

  return foo; // is the copy constructor called here?
}

Foo bar() {
  // more lines of code

  return Foo(); // is the copy constructor called here?
}

int main() {
  Foo a = foo();
  Foo b = bar();  
}

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

Ответы [ 3 ]

10 голосов
/ 03 марта 2011

Это может быть вызвано или не может быть вызвано.Компилятор имеет возможность использовать оптимизацию возвращаемого значения в обоих случаях (хотя оптимизация немного проще в bar, чем в foo).

Даже если RVO устраняет фактические вызовы конструктора копирования, конструктор копирования все еще должен быть определен и доступен.

8 голосов
/ 03 марта 2011

Зависит от того, применяется ли Оптимизация возвращаемого значения или нет.

2 голосов
/ 03 марта 2011

Это может называться. Это также может быть оптимизировано. См. другой вопрос в том же направлении.

...