gpt4 book ai didi

c++ - 是否允许编译器支持标准中已删除的功能?

转载 作者:行者123 更新时间:2023-12-01 15:10:16 25 4
gpt4 key购买 nike

在第一段中,cppreference.com明确指出throw(T1, ..., Tn)在C++ 17中已删除。
令我感到困惑的是,某些编译器在C++ 17模式下支持throw(T1, ..., Tn)(see demo)。

  • MSVC默认情况下支持它,但是您可以为其打开警告,请参阅C5040/we5040可以将其转换为错误。
  • Clang默认将其报告为错误,但是可以使用-Wno-dynamic-exception-spec关闭该错误。
  • GCC让您别无选择:这是一个错误。

  • 是否允许编译器支持标准中已删除的功能?出于什么目的?
    或者这仅仅是一个编译器扩展,例如GCC中的 void foo(int size) { char a[size]; },请参见 demo

    最佳答案

    Are compilers allowed to support a feature, that is removed in the standard?


    该标准不允许这样做。 AFAIK通常不会对以前使用该语言的功能进行任何特殊处理(不会将它们与不存在的功能区分开)。
    如果编译器没有通过特定配置(即特定标志)诊断出该错误(即未给出错误或警告),则它不符合该配置中的标准。

    For what purpose?


    向后兼容(还可以是什么)。更具体地说,它使您可以在同一翻译单元中同时使用旧功能和新功能。
    如果您使用的库的 header 中使用了已删除的功能,但又想在自己的代码中使用新的语言功能,则此功能很有用。
    或者,由于某种原因,如果您想在自己的代码中使用已删除的功能以及新功能。

    注意,实际上不可能达到对标准的绝对符合。
    一些编译器供应商比其他供应商更关注一致性。微软倾向于对此不太在意(或者至少在过去,他们一直在努力)。

    关于c++ - 是否允许编译器支持标准中已删除的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63228412/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com