Конструктор делегирует себя в 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:
Если программа содержит нарушение правила, для которого не требуется диагностика, настоящий международный стандарт не устанавливает требований в отношении реализации этой программы.