#cpp #шаблоны_с++ #language_lawyer
Насколько я понимаю, следующая программа не должна компилироваться в соответствии со стандартом, однако последние версии gcc, clang и MSVC компилируют её без ошибок. Я что-то неправильно понимаю или это дефекты компиляторов? 12.7 Name resolution [temp.res] 8 … The program is ill-formed, no diagnostic required, if: (8.3) every valid specialization of a variadic template requires an empty template parameter pack templatestruct A { A(const Args&... args) : x(0, args...) {} int x; }; int main() { A<> x; }
Ответы
Ответ 1
The program is ill-formed, no diagnostic required и gcc, clang и MSVC компилируют её без ошибок Ошибка - это и есть diagnostic. В этом случае стандарт разрешает ее не печатать. (Любая ошибка - это diagnostic, но не любой diagnostic - это ошибка. Подробнее ниже.) Вообще, стандарт не запрещает компиляторам компилировать ill-formed программы. Единственное требование: Компилятор обязан выдать diagnostic - то есть указать пользователю на ошибку (если нет приписки 'no diagnostic required', конечно) - с помощью ошибки компиляции или предупреждения. Если компилятор продолжил компиляцию несмотря на ошибку, то полученная программа может вести себя как угодно - стандарт не делает по этому поводу никаких гарантий.
Комментариев нет:
Отправить комментарий