Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 定义完整函数模板的语法如何专门化类的朋友?_C++_Templates_Language Lawyer_Friend Function - Fatal编程技术网

C++ 定义完整函数模板的语法如何专门化类的朋友?

C++ 定义完整函数模板的语法如何专门化类的朋友?,c++,templates,language-lawyer,friend-function,C++,Templates,Language Lawyer,Friend Function,我在(“模板朋友操作符”部分)看到了下面的示例,简化了 模板结构Foo; 模板无效条(Foo){} 模板 结构Foo{ //朋友无效栏(Foo f);/(1) 朋友无效条(Foo f);/(2) }; int main(){ 巴尔(Foo{}); } 在这里,(1)或(2)都同样有效。我知道在(1)编译器中说bar的一个具体实例(即带有这样或那样的参数的bar)是Foo的朋友,但我不明白(2)中发生了什么 编译器对(2)中的条使用什么类型参数?一般来说,这是如何工作的?该语法是如何调用的,它是

我在(“模板朋友操作符”部分)看到了下面的示例,简化了

模板结构Foo;
模板无效条(Foo){}
模板
结构Foo{
//朋友无效栏(Foo f);/(1)
朋友无效条(Foo f);/(2)
};
int main(){
巴尔(Foo{});
}
在这里,
(1)
(2)
都同样有效。我知道在
(1)
编译器中说
bar
的一个具体实例(即带有这样或那样的参数的
bar
)是
Foo
的朋友,但我不明白
(2)
中发生了什么


编译器对
(2)
中的
使用什么类型参数?一般来说,这是如何工作的?该语法是如何调用的,它是在标准中定义的吗?

参见C++17[temp.friend]/1:

类或类模板的朋友可以是函数模板或类模板、函数模板或类模板的专门化或非模板函数或类。对于不是模板声明的友元函数声明:

  • 如果友元的名称是限定的或非限定的模板id,则友元声明引用函数模板的专门化,否则
  • 如果友元的名称是限定id,并且在指定的类或命名空间中找到匹配的非模板函数,则友元声明引用该函数,否则
  • 如果友元的名称是限定id,并且在指定的类或命名空间中找到匹配的函数模板,则友元声明引用该函数模板(17.8.2.6)的推断专门化,否则
  • 名称应为声明(或重新声明)非模板函数的非限定id
名称
bar
bar
都是模板ID,因此如果使用其中一个,则它表示函数模板
::bar
的专门化。如[temp.arg.explicit]中所述:

引用函数模板专用化时,可以通过使用模板参数列表限定函数模板名称来指定模板参数。。。引用函数模板的特殊化时,可以指定模板参数列表。。。在朋友声明中。可以从显式模板参数列表中忽略从默认模板参数推导(17.8.2)或获得的后续模板参数。。。如果所有的模板参数都可以推导,那么它们都可以省略


因此,友元声明中
bar
的含义是,应进行模板参数推导,以确定引用的是
bar
的哪个专门化。当然,推导出的专门化是采用
Foo
类型的参数的专门化。因此,带有
bar
bar
的两个声明具有相同的含义。

参见C++17[temp.friend]/1:

类或类模板的朋友可以是函数模板或类模板、函数模板或类模板的专门化或非模板函数或类。对于不是模板声明的友元函数声明:

  • 如果友元的名称是限定的或非限定的模板id,则友元声明引用函数模板的专门化,否则
  • 如果友元的名称是限定id,并且在指定的类或命名空间中找到匹配的非模板函数,则友元声明引用该函数,否则
  • 如果友元的名称是限定id,并且在指定的类或命名空间中找到匹配的函数模板,则友元声明引用该函数模板(17.8.2.6)的推断专门化,否则
  • 名称应为声明(或重新声明)非模板函数的非限定id
名称
bar
bar
都是模板ID,因此如果使用其中一个,则它表示函数模板
::bar
的专门化。如[temp.arg.explicit]中所述:

引用函数模板专用化时,可以通过使用模板参数列表限定函数模板名称来指定模板参数。。。引用函数模板的特殊化时,可以指定模板参数列表。。。在朋友声明中。可以从显式模板参数列表中忽略从默认模板参数推导(17.8.2)或获得的后续模板参数。。。如果所有的模板参数都可以推导,那么它们都可以省略

因此,友元声明中
bar
的含义是,应进行模板参数推导,以确定引用的是
bar
的哪个专门化。当然,推导出的专门化是采用
Foo
类型的参数的专门化。因此,带有
bar
bar
的两个声明具有相同的含义