C++ [temp.spec]/5和[basic.odr]w.r.t.显式专门化的odr规则之间是否存在冲突? 背景
有几个Q&a涵盖了这样一个事实,即函数模板的显式专门化不是函数模板而是函数,因此属于 […]内联函数或变量可以有多个定义 使以下示例(经常)显示为格式良好:C++ [temp.spec]/5和[basic.odr]w.r.t.显式专门化的odr规则之间是否存在冲突? 背景,c++,templates,language-lawyer,template-specialization,one-definition-rule,C++,Templates,Language Lawyer,Template Specialization,One Definition Rule,有几个Q&a涵盖了这样一个事实,即函数模板的显式专门化不是函数模板而是函数,因此属于 […]内联函数或变量可以有多个定义 使以下示例(经常)显示为格式良好: // foo.h // ----- template<typename T> void foo(T) {} // explicit specialization template<> inline void foo<int>(int) { int a; (void)a; } // ^^^ note: i
// foo.h
// -----
template<typename T>
void foo(T) {}
// explicit specialization
template<>
inline void foo<int>(int) { int a; (void)a; }
// ^^^ note: inline
// bar.cpp
----------
#include "foo.h"
void bar() { foo<int>(42); }
// baz.cpp
----------
#include "foo.h"
void baz() { foo<int>(42); }
//foo.h
// -----
模板
void foo(T){}
//显性专业化
模板
内联void foo(int){inta;(void)a;}
//^^^注:内联
//bar.cpp
----------
#包括“foo.h”
void bar(){foo(42);}
//baz.cpp
----------
#包括“foo.h”
void baz(){foo(42);}
具体而言,根据[basic.def.odr]/13.3,即使在两个翻译单元(与bar.cpp
和baz.cpp
相关的TU)中定义了foo(int)
,也不存在odr冲突,因为显式专门化/函数是inline
然而,根据[emphasismine]:
对于给定的模板和一组给定的模板参数,[…]在程序中最多定义一次显式专门化(根据[basic.def.odr])
在一个程序中,明确的专门化最多只能定义一次(尽管参考了[basic.def.odr];没有特别的章节)
问题:
- [temp.spec]/5和[basic.odr]w.r.t.显式专门化的odr规则之间是否存在冲突?还是应该将前者的规则简单地理解为“除非适用”
D
在这里可以说既不是模板也不是模板化实体,而是一个明确的专业化;/14仍然适用吗?@cppleerner对我来说,很明显,如果段落以“ifD
是一个模板…”开头,那么D
所指的段落的其余部分意味着该模板,而不是上一段中的其他内容。我打开了一个问题:。