Возможный дубликат:
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
Что тут происходит?
Кроме того, как я могу предотвратить себя от этого случайно? — возможно ли сделать это ошибкой компилятора?
(§ 3.3.2 / 1) пункт декларации имя сразу после его полного декларатора (пункт 8) и до его инициализатор (если есть), за исключением случаев, указанных ниже. [ Пример:
int x = 12; { int x = x; }
Здесь второй x инициализируется своим собственным (неопределенным) значением. — конец примера]
Это относится к пользовательским типам, таким как ваш class A
, также. Используется конструктор копирования по умолчанию, автоматически сгенерированный компилятором.
Других решений пока нет …