класс — Почему вы можете вызвать конструктор копирования, передавая объект, который вы создаете? (C ++) (gcc)

Возможный дубликат:
std :: string x (x);

class A {};

int main() {

A a(a);
}

Это компилируется.

GCC (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
g++ -o main main.cpp -Wall -w -ansi

Я не получаю предупреждений.

Почему это похоже на действительный C ++?
Это упомянуто где-нибудь в стандарте?
Есть ли предупреждающие флаги, которые могут сообщить об этом для gcc?

Когда у класса есть данные члена, данные заканчиваются случайным образом.
пример:

#include <iostream>

class A {

public:
int i;
A() : i{6} {}
};

int main() {

A a(a);
std::cout << a.i << '\n';
}

выход: -482728464

Что тут происходит?
Кроме того, как я могу предотвратить себя от этого случайно? — возможно ли сделать это ошибкой компилятора?

8

Решение

(§ 3.3.2 / 1) пункт декларации имя сразу после его полного декларатора (пункт 8) и до его инициализатор (если есть), за исключением случаев, указанных ниже. [ Пример:

int x = 12;
{ int x = x; }

Здесь второй x инициализируется своим собственным (неопределенным) значением. — конец примера]

Это относится к пользовательским типам, таким как ваш class A, также. Используется конструктор копирования по умолчанию, автоматически сгенерированный компилятором.

10

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

Других решений пока нет …

По вопросам рекламы [email protected]