因此,我试图编译下面的代码,结果失败了(正如预期的那样):
1.cpp: In function ‘int foo()’:
1.cpp:3:5: error: ‘some’ was not declared in this scope
some ill-formed code
^但是,如果我删除这一行,编译器编译它时不会出现任何错误(这也是因为不知道T类型是否有random_name()方法)。
对于没有使用(而不是实例化)的模板的诊断似乎是在某种程度上定义的实现。但是,对于这种情况,标准也许有一些要求。例如,编译下面的代码是否符合标准,没有任何错误?
我试图在网站上搜索答案,但没有找到任何相关的问题。
template <class T>
int foo() {
some ill-formed code
return T::random_name();
}
template <>
int foo<int>() { return 0; }
int main() {
return foo<int>();
}发布于 2018-11-26 02:30:59
这是一个实现质量问题,它的格式不正确,但如果没有实例化,则不需要按照[temp.res#8.1]p进行诊断。
在任何实例化之前,可以检查模板的有效性。 注意:知道哪些名称是类型名称,允许以这种方式检查每个模板的语法。- end注意到程序格式不正确,不需要诊断,如果:
我们可以看到,从这个活生生的哥德波特例子 MSVC没有诊断这种情况。这是因为MSVC不使用两阶段查找。,但是使用/permissive-会改变这一点。clang甚至有一个使用MSVC兼容模式来模拟此的-fdelayed-template-parsing。
我们可以看到,使用这两个选项 clang不再产生诊断,但MSVC可以。
发布于 2018-11-26 02:38:38
函数template中的名称是依赖的,即实体依赖于某种形式的template参数,或者它们是独立的,也就是说,没有迹象表明它依赖于template参数。在定义函数template时,查找独立的名称。在template实例化过程中查找依赖的名称,即在定义函数template时不需要定义名称。找不到名字是个错误.这个过程的细节涉及得更多一些,并且填补了关于template的大部分章节。
在您的示例中,some是一个独立的名称,而T::限定使random_name成为一个依赖的名称。
https://stackoverflow.com/questions/53473934
复制相似问题