对于从未实例化过的模板代码,GCC似乎更加宽容。我有一个使用g++-5.1
编译时没有警告或错误的代码库(使用-Wall -Wextra -Wdeprecated -Wno-comment -Wnoexcept
),但使用clang++-3.7
会发出许多关于模板代码的错误,除非我指定-fdelayed-template-parsing
。关于这面旗帜的文件非常稀少;我能找到的只是一个描述其行为的single sentence:
-fdelayed-template-parsing
让clang延迟解析函数模板定义,直到翻译单元结束。
即使这看起来可能不正确 - 我认为问题是模板正在解析所有,并且该标志实际上允许Clang完成编译,无需永远解析相关模板。
所以我想知道:
-fdelayed-template-parsing
对GCC默认行为的行为有多相似?该选项本身基于MSVC,正如flag-name所暗示的那样,它甚至不检查基本语法问题,例如在未实例化的模板代码中缺少分号。我相信GCC在这里比MSVC更进一步,这个标志实际上是否使得Clang 比GCC更少限制?编辑:根据要求,这是一个简单的模板示例(如果没有实例化)不导致GCC错误但 >使用Clang导致错误:
template <typename T>
std::string neverInstantiated(void)
{
return 3;
}
显然,由于模板参数未使用,无论如何实例化,这都是明显不正确的。
答案 0 :(得分:2)
来自[temp.res]:
如果无法为模板生成有效的专业化,并且未实例化该模板,则模板格式错误,无法诊断 必需的。
因此两个编译器在这方面都有有效的行为。
然而,不是试图让clang不发布诊断,或者试图让GCC 发布发布一个......我认为最好利用clang&# 39;在这里进行额外的诊断,只需删除不正确的模板!为什么要用无效代码污染代码库呢?