【机翻】在专门化之前使用模板?
作者:互联网
我发现,如果您使用包装模板,您可以在模板首次使用后对其进行专门化。简单的例子
#include <iostream>
template<typename T>
const char* templateImpl();
template<typename T>
const char* templateGetter() { return templateImpl<T>(); }
struct S{};
int main(){ std::cout << templateGetter<S>() << std::endl; return 0; }
template<>
const char* templateImpl<S>(){ return "S"; }
这适用于每个编译器 - 我并不惊讶 MSVC 编译它,因为它以不同的方式处理模板,但 GCC 和 clang 也允许它。 我认为标准要求在第一次使用之前进行专业化,在这种情况下,这意味着在 main 之前并期望他们报告错误。 我错过了什么,这个代码标准符合吗?
澄清一下,如果我在 main 中将 templateGetter<S> 更改为 templateImpl<S>,则程序将不会编译,并显示我期望的错误消息: main.cpp:14:29: 错误:实例化后“const char* templateImpl() [with T = S]”的特化
===========================================
你有(不)幸运。这是格式错误的 NDR。 [temp.expl.spec]/6-7: 6 如果模板、成员模板或类模板的成员是显式特化的,则应在第一次使用该特化之前声明该特化,这将导致隐式实例化发生,在每个翻译单元中,这样的使用发生;不需要诊断。 [...] 7 函数模板、类模板、变量模板、类模板的成员函数、类模板的静态数据成员、类模板的成员类、类模板的成员枚举、类模板的成员类模板、成员类模板的函数模板、类模板的静态数据成员模板、类模板的成员模板的成员函数、非模板类的成员模板的成员函数、非模板类的静态数据成员模板、成员类的成员函数模板类模板等,以及类模板、变量模板、非模板类的成员类模板、非模板类的静态数据成员模板、类模板的成员类模板等的偏特化声明的放置,可以根据显式规范的相对定位影响程序是否格式良好上面和下面指定的翻译单元中的初始化声明及其实例化点。在编写专业时,要注意它的位置;或者让它编译将是一种点燃它自焚的试验。
p7 在这里不是很有用,但我忍不住要引用它:) 实例化 templateGetter<S> 会导致 templateImpl<S> 声明的隐式实例化。 您没有看到代码错误,因为许多实现喜欢尽可能将模板实例化推迟到翻译单元结束时,这是一种允许的实现技术。 (我不会在这里引用标准语,但您会发现函数模板特化在翻译单元的末尾有一个额外的实例化点。)
标签:静态数据,templateImpl,专门化,成员,实例,机翻,模板,特化 来源: https://blog.csdn.net/lordmr/article/details/117949475