конструктор делегирует себя в g ++ & amp; лязг ++

Рассмотрим следующую программу. Я случайно ошибся в этом.

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.

Итак, вопрос здесь в том, какой компилятор находится здесь в соответствии со стандартом? Это ошибка в одном из этих компиляторов? Что именно здесь происходит в вышеуказанной программе? Поправьте меня, если я ошибаюсь где-то в моем понимании. Почему одна и та же программа демонстрирует разное поведение в разных версиях этих компиляторов?

4

Решение

Из C ++ 11, [class.base.init] №6:

Если конструктор делегирует самому себе прямо или косвенно, программа плохо сформирована; Диагностика не требуется.

Все компиляторы правы — код не работает, и компилятор не обязан вам это говорить. На данный момент у вас есть UB; из [intro.compliance] №2:

Если программа содержит нарушение правила, для которого не требуется диагностика, настоящий международный стандарт не устанавливает требований в отношении реализации этой программы.

9

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

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

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