Рассмотрим следующую программу. Я случайно ошибся в этом.
struct T {
int s;
T() : T() {
s=9;
}
};
int main() {
T t;
}
Приведенный выше код компилируется & работает нормально в некоторых версиях g ++, таких как g ++ 4.8.1 (см. живую демонстрацию Вот ) & clang ++ 3.6.0 (см. живую демонстрацию Вот ) & в MSVC ++ 2015, но вылетает во время выполнения. Это дает мне ошибка сегментации ошибка. Я думаю, что из-за рекурсии я имею в виду рекурсивный вызов конструктора. Но самые последние версии G ++ & clang ++ не может скомпилировать этот код, выдав следующую ошибку:
g ++ 4.9.2 выдает следующую ошибку (см. демо Вот )
prog.cc: In constructor 'T::T()':
prog.cc:3:10: error: constructor delegates to itself
T() : T() {
clang ++ выдает следующую ошибку (см. живую демонстрацию Вот )
main.cpp:4:8: error: constructor for 'T' creates a delegation cycle [-Wdelegating-ctor-cycles]
T() : T() {
^
1 error generated.
Итак, вопрос здесь в том, какой компилятор находится здесь в соответствии со стандартом? Это ошибка в одном из этих компиляторов? Что именно здесь происходит в вышеуказанной программе? Поправьте меня, если я ошибаюсь где-то в моем понимании. Почему одна и та же программа демонстрирует разное поведение в разных версиях этих компиляторов?
Из C ++ 11, [class.base.init] №6:
Если конструктор делегирует самому себе прямо или косвенно, программа плохо сформирована; Диагностика не требуется.
Все компиляторы правы — код не работает, и компилятор не обязан вам это говорить. На данный момент у вас есть UB; из [intro.compliance] №2:
Если программа содержит нарушение правила, для которого не требуется диагностика, настоящий международный стандарт не устанавливает требований в отношении реализации этой программы.
Других решений пока нет …