Ошибка, когда имеют частную копию ctor с общедоступным оператором присваивания

Нет никакой групповой команды к , очищают консоль на обеих платформах .

#include 

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}

6
задан svick 20 January 2013 в 16:43
поделиться

6 ответов

Конечно, полезно понимать разницу, когда кто-то создает компиляторы.

Вот несколько статей, которые я написал о том, как различные проблемы в управлении памятью влияют на разработка и реализация языка C # и среды CLR:

http://blogs.msdn.com/ericlippert/archive/tags/Memory+Management/default. В стандарте указано:
Временный объект должен быть инициализирован (8.5.3 п. 5) «с использованием правил инициализации нереференсной копии (8.5)».

Конструкция копирования удалена для временного (разрешено стандартом. 12.8 п. 5).
Однако в стандарте четко указано (12.2 п. 1):
«Даже когда создание временного объекта избегается (12.8), все семантические ограничения должны соблюдаться, как если бы временный объект был создан. [Пример: даже если конструктор копирования не вызывается, все семантические ограничения, такие как доступность (пункт 11), должно быть выполнено.] "

(также, при поиске правильной цитаты, нашел этот дубликат :)

Изменить: добавление соответствующего местоположения из стандарта

5
ответ дан 9 December 2019 в 20:45
поделиться

Этот код компилируется с gcc 4.3.3 и 4.4.1. Может, это просто ошибка в gcc 4.1?

4
ответ дан 9 December 2019 в 20:45
поделиться

Предполагая, что опубликованный вами код является единственным кодом в проекте, и нигде не происходит скрытой передачи Foos по значению, все, что я могу понять, это то, что gcc оптимизирует

Foo foo;
foo = Foo();

в

Foo foo = Foo();

... что неразумно, так как первая форма является конструкцией по умолчанию и присваиванием, а вторая эквивалентна

Foo foo(Foo());

... которая явно является копирующей конструкцией. Если я прав, конструктор копирования не запускается, потому что GCC может оптимизировать избыточное временное; это разрешено спецификацией C ++

В общем, иметь операторы присваивания и конструкторы копирования на разных уровнях защиты - не лучшая идея; как вы видели, результаты могут быть не интуитивными.

3
ответ дан 9 December 2019 в 20:45
поделиться

Copy Ctor вызывается, когда:

  1. передача объекта по значению в качестве параметра функции,
  2. возврат объекта из функции.

Таким образом, вы определенно выполняете один или оба эти случая где-то в вашем коде. Вам следует сделать Copy Ctor общедоступным или избегать двух предыдущих случаев.

1
ответ дан 9 December 2019 в 20:45
поделиться

Конструктор копирования будет вызван, если вы напишете

Foo foo; // normal constructor
Foo foo1(foo); //copy constructor

. В вашем случае сначала вызывается конструктор по умолчанию, а затем метод operator =.

0
ответ дан 9 December 2019 в 20:45
поделиться
#include <iostream>

using namespace std;

class Foo
{
public:
  Foo() { cout << "Foo::Foo()" << endl << endl; }
  Foo& operator=(const Foo&) { cout << "Foo::operator=(const Foo&)" << endl << endl; }
  Foo(const Foo& b) { *this = b; cout << "Foo::Foo(const Foo&)" << endl << endl; }
};

int main()
{
  Foo f1;// default constructor called

  Foo f2 = f1; //copy constructor called
}

Отметьте это в Foo f2 = f1; ( f2 создается с использованием конструктора копирования)

-1
ответ дан 9 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: