LINUX.ORG.RU

конструктор копирования

 ,


0

1

Есть класс:

struct A {
  A(const &A a) {...}
}

и функция:

A& f(A a) {
  //...
  return a;
}

Если я вызываю:

A a;
auto b = f(a);

то при обращении получается обращение к чужой памяти. почему? ожидал, что при вызове f значение «a» скопируется и в «b» будет ссылка на эту копию. это не так?


и функция:

возващающая ссылку на временный объект. Дальше не смотрел

yoghurt ★★★★★ ()

Скорее всего тебе нужно это

-- A& f(A a) {
++ A f(A a) {

Конструктор копирования, кстати, врядли будет вызван, потому что будет задействована RVO, но это уже детали.

yoghurt ★★★★★ ()

и в «b» будет

ссылка на несуществующий объект. Выстрел в ногу из парижской палаты мер и весов.

nanoolinux ★★★★ ()
Последнее исправление: nanoolinux (всего исправлений: 1)
A& f(A a)

Ну правильно, ты передаешь A по значению, создаётся временный объект. А ты хочешь вернуть на него ссылку.

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

devsdc ★★ ()

ожидал, что при вызове f значение «a» скопируется и в «b» будет ссылка на эту копию. это не так?

Не так. Ты принимаешь a объект по значению, а не по ссылке.

anonymous ()

ожидал, что при вызове f значение «a» скопируется и в «b» будет ссылка на эту копию. это не так?

Почему ты так ожидал? Возвращаешь-то ты ссылку(&), а принимаешь-то значение.

Так

A& f(A &a) {
  //...
  return a;
}

или

const A& f(const A &a) {
  //...
  return a;
}

При этом помни, что возвращать ссылку на локальный объект нельзя.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.