在Clang和GCC之间获取类似的未实例化模板行为?

时间:2015-06-05 18:04:43

标签: c++ templates c++11 g++ clang++

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

  

-fdelayed-template-parsing让clang延迟解析函数模板定义,直到翻译单元结束。

即使这看起来可能不正确 - 我认为问题是模板正在解析所有,并且该标志实际上允许Clang完成编译,无需永远解析相关模板。

所以我想知道:

  1. -fdelayed-template-parsing对GCC默认行为的行为有多相似?该选项本身基于MSVC,正如flag-name所暗示的那样,它甚至不检查基本语法问题,例如在未实例化的模板代码中缺少分号。我相信GCC在这里比MSVC更进一步,这个标志实际上是否使得Clang 比GCC更少限制?
  2. 反过来说,有没有办法让GCC在这方面表现得更像Clang,因为在未实例化的模板中发出了非法代码的错误或至少是警告?
  3. 编辑:根据要求,这是一个简单的模板示例(如果没有实例化)导致GCC错误但 >使用Clang导致错误:

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

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

1 个答案:

答案 0 :(得分:2)

来自[temp.res]:

  

如果无法为模板生成有效的专业化,并且未实例化该模板,则模板格式错误,无法诊断   必需的。

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

然而,不是试图让clang不发布诊断,或者试图让GCC 发布发布一个......我认为最好利用clang&# 39;在这里进行额外的诊断,只需删除不正确的模板!为什么要用无效代码污染代码库呢?