Конструктор делегирует себя в g++ и clang++

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

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.

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам