Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ [temp.spec]/5和[basic.odr]w.r.t.显式专门化的odr规则之间是否存在冲突? 背景_C++_Templates_Language Lawyer_Template Specialization_One Definition Rule - Fatal编程技术网

C++ [temp.spec]/5和[basic.odr]w.r.t.显式专门化的odr规则之间是否存在冲突? 背景

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

有几个Q&a涵盖了这样一个事实,即函数模板的显式专门化不是函数模板而是函数,因此属于

[…]内联函数或变量可以有多个定义

使以下示例(经常)显示为格式良好:

// 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规则之间是否存在冲突?还是应该将前者的规则简单地理解为“除非适用”

@cpplearner本段如何适用于明确的专业化?@cpplearner但是
D
在这里可以说既不是模板也不是模板化实体,而是一个明确的专业化;/14仍然适用吗?@cppleerner对我来说,很明显,如果段落以“if
D
是一个模板…”开头,那么
D
所指的段落的其余部分意味着该模板,而不是上一段中的其他内容。我打开了一个问题:。