首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有实例化的模板的C++标准需求

没有实例化的模板的C++标准需求
EN

Stack Overflow用户
提问于 2018-11-26 02:09:49
回答 2查看 182关注 0票数 2

因此,我试图编译下面的代码,结果失败了(正如预期的那样):

代码语言:javascript
复制
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()方法)。

对于没有使用(而不是实例化)的模板的诊断似乎是在某种程度上定义的实现。但是,对于这种情况,标准也许有一些要求。例如,编译下面的代码是否符合标准,没有任何错误?

我试图在网站上搜索答案,但没有找到任何相关的问题。

代码语言:javascript
复制
template <class T>
int foo() {
    some ill-formed code
    return T::random_name();
}

template <>
int foo<int>() { return 0; }

int main() {
    return foo<int>();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-26 02:30:59

这是一个实现质量问题,它的格式不正确,但如果没有实例化,则不需要按照[temp.res#8.1]p进行诊断。

在任何实例化之前,可以检查模板的有效性。 注意:知道哪些名称是类型名称,允许以这种方式检查每个模板的语法。- end注意到程序格式不正确,不需要诊断,如果

  • 如果模板中的语句没有实例化,或者

我们可以看到,从这个活生生的哥德波特例子 MSVC没有诊断这种情况。这是因为MSVC不使用两阶段查找。,但是使用/permissive-会改变这一点。clang甚至有一个使用MSVC兼容模式来模拟此-fdelayed-template-parsing

我们可以看到,使用这两个选项 clang不再产生诊断,但MSVC可以。

票数 6
EN

Stack Overflow用户

发布于 2018-11-26 02:38:38

函数template中的名称是依赖的,即实体依赖于某种形式的template参数,或者它们是独立的,也就是说,没有迹象表明它依赖于template参数。在定义函数template时,查找独立的名称。在template实例化过程中查找依赖的名称,即在定义函数template时不需要定义名称。找不到名字是个错误.这个过程的细节涉及得更多一些,并且填补了关于template的大部分章节。

在您的示例中,some是一个独立的名称,而T::限定使random_name成为一个依赖的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53473934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档