Разрешено ли компиляторам поддерживать функцию, которая удалена в стандарте? - PullRequest
1 голос
/ 03 августа 2020

В первом абзаце cppreference.com четко указано, что throw(T1, ..., Tn) удалено в C ++ 17.

Меня смущает, что некоторые компиляторы поддерживают throw(T1, ..., Tn) в C + +17 режим ( см. Демонстрацию ).

  • MSV C поддерживает его по умолчанию, но вы можете включить для него предупреждение, см. C5040 . Это можно превратить в ошибку с помощью /we5040.
  • Clang по умолчанию сообщает об ошибке, но ошибку можно отключить с помощью -Wno-dynamic-exception-spec.
  • G CC уходит у вас нет выбора: это ошибка.

Разрешено ли компиляторам поддерживать функцию, которая удалена в стандарте? С какой целью?

Или это просто расширение компилятора, например void foo(int size) { char a[size]; } в G CC, см. demo .

Ответы [ 3 ]

4 голосов
/ 03 августа 2020

Разрешено ли компиляторам поддерживать функцию, которая удалена в стандарте?

Стандарт не позволяет этого. AFAIK, как правило, он не обрабатывает особенности, которые раньше были на языке (не отделяет их от несуществующих функций).

Если компилятор не делает ' t диагностировать эту ошибку (то есть не выдает ошибку или предупреждение) с определенной конфигурацией c (т.е. с указанием c флагов), тогда она не соответствует стандарту в этой конфигурации.

С какой целью?

Обратная совместимость (что еще может быть). В частности, он позволяет использовать как старые, так и новые функции в одной единице перевода.

Это может быть полезно, если вы используете библиотеку, которая использует удаленную функцию в своих заголовках, но хотите использовать новую языковые функции в вашем собственном коде.

Или, если вы по какой-то причине хотите использовать удаленную функцию в своем собственном коде вместе с новыми функциями.

Обратите внимание, что абсолютного соответствия стандарту практически невозможно достичь.

Некоторые поставщики компиляторов заботятся о соответствии больше, чем другие. Microsoft, как правило, меньше заботится об этом (или, по крайней мере, раньше они над этим работали).

2 голосов
/ 03 августа 2020

На это нет однозначного ответа.

Некоторые вещи, выходящие за рамки Стандарта, можно рассматривать как чистые улучшения. Некоторые из этих улучшений предложены в Стандарте («Это зависит от реализации, если X»), некоторые даже не упоминаются (#include <windows.h>).

В остальном Стандарт требует, чтобы компилятор отмечает нарушение Стандарта. Но Стандарт не говорит об ошибках или предупреждениях. Вместо этого написано «Diagnosti c Required», что означает ошибку или предупреждение. А в других случаях даже написано «Диагностика c не требуется» (NDR), что означает, что компилятор не обязан отмечать нестандартный код.

Таким образом, в зависимости от удаленной функции он может или может не требует диагностики c. И если для этого действительно требуется диагностика c, вы часто можете сказать компилятору, что в любом случае вас не интересует эта конкретная диагностика c.

0 голосов
/ 03 августа 2020

Разрешено ли компиляторам поддерживать функцию, которая удалена в стандарте? С какой целью?

Компиляторы могут делать все, что захотят. Стандарт C ++ диктует правила для языка C ++ , и, хотя они консультируются с поставщиками компиляторов, чтобы убедиться, что его правила реализованы, сами поставщики будут делать то, что они считают лучшим для себя и своих пользователей. У компиляторов есть много нестандартных функций, которые разработчики используют постоянно. И я не думаю, что какие-либо из этих компиляторов полностью соответствуют стандарту по умолчанию.

Тем не менее, я бы не назвал компилятор + настройки «совместимым с C ++ 17», если они разрешили код не -С ++ 17 или отклонили действительный код код С ++ 17 (в соответствии со стандартом). У большинства компиляторов есть настройки, которые можно установить, если требуется полное соответствие.

Если вы хотите быть педантичным c, хотя MSV C даже не совместим с C ++ 11 из-за отсутствия препроцессора . Стандарт - это еще не все.

...