gpt4 book ai didi

c++ - 对于未实例化的模板,在 Clang 和 GCC 之间获得类似的行为?

转载 作者:行者123 更新时间:2023-11-30 03:52:31 32 4
gpt4 key购买 nike

对于从未实例化的模板代码,GCC 似乎比 Clang 更加宽松。我有一个代码库,使用 g++-5.1(使用 -Wall -Wextra -Wdeprecated -Wno-comment -Wnoexcept)编译时没有警告或错误,但会发出许多关于模板的错误使用 clang++-3.7 的代码,除非我指定 -fdelayed-template-parsing。关于这个标志的文档非常少;我能找到的就是single sentence描述它的行为:

-fdelayed-template-parsing lets clang delay parsing of function template definitions until the end of a translation unit.

即使这看起来可能是不正确的——我认为问题是模板正在被解析根本,并且该标志实际上允许 Clang在从未解析有问题的模板的情况下完成编译。

所以我想知道:

  1. -fdelayed-template-parsing 的行为与 GCC 的默认行为有多相似?该选项本身基于 MSVC,正如标志名称所暗示的那样,它甚至不检查基本语法问题,例如未实例化的模板代码中缺少分号。我相信 GCC 在这方面比 MSVC 走得更远,那么这个标志实际上是否使 Clang 比 GCC 更少限制?
  2. 换句话说,有没有办法让 GCC 在这方面表现得更像 Clang,即针对未实例化模板中的非法代码发出错误或至少发出警告?

编辑:根据要求,这是一个简单的模板示例(如果未实例化)不会导致 GCC 错误,但 使用 Clang 引起错误:

template <typename T>
std::string neverInstantiated(void)
{
return 3;
}

显然,由于未使用模板参数,因此无论它是如何实例化的,这都是明显不正确的。

最佳答案

来自 [temp.res]:

If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.

所以两个编译器在这方面都有有效的行为。

但是,与其试图让 clang 不发出诊断,或者试图让 GCC 发出诊断...我认为最好在这里利用 clang 的附加诊断并简单地删除格式错误的模板!你为什么要用无效代码污染你的代码库?

关于c++ - 对于未实例化的模板,在 Clang 和 GCC 之间获得类似的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30673043/

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