Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Программа корректна только для пустой пачки параметров

#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


template
struct 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', конечно) - с помощью ошибки компиляции или предупреждения. Если компилятор продолжил компиляцию несмотря на ошибку, то полученная программа может вести себя как угодно - стандарт не делает по этому поводу никаких гарантий.

Комментариев нет:

Отправить комментарий