Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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_Static - Fatal编程技术网

C++ 为什么使用静态函数模板?

C++ 为什么使用静态函数模板?,c++,templates,static,C++,Templates,Static,我在读亚历克斯·格雷夫斯的。 在他的代码中有许多静态函数模板,它们不是类成员方法,而是定义为静态的,而有些则不是。(见下文) 一些代码片段包括: 。。。 //静止的 模板静态无效排序(R&R) { 排序(boost::begin(r),boost::end(r)); } //静止的 模板静态无效反向排序(R&R) { 排序(boost::rbegin(r),boost::rend(r)); } //非静态 模板对最小值最大值(常数R&R) { 对p=minmax_元素(boost::begin(

我在读亚历克斯·格雷夫斯的。 在他的代码中有许多静态函数模板,它们不是类成员方法,而是定义为
静态的
,而有些则不是。(见下文)

一些代码片段包括:

。。。
//静止的
模板静态无效排序(R&R)
{
排序(boost::begin(r),boost::end(r));
}
//静止的
模板静态无效反向排序(R&R)
{
排序(boost::rbegin(r),boost::rend(r));
}
//非静态
模板对最小值最大值(常数R&R)
{
对p=minmax_元素(boost::begin(r),boost::end(r));
返回make_pair(*p.first,*p.second);
}
//静止的
模板静态void bound_range(R&R,常量typename boost::range_value::type&minVal,常量typename boost::range_value::type&maxVal)
{
for(typename range_iterator::type it=boost::begin(r);it!=boost::end(r);+it)
{
*it=绑定(*it,minVal,maxVal);
}
}
...

为什么这些全局函数模板中的一些定义为静态,而另一些定义为

在这种情况下,
静态
关键字指的是静态链接,即该函数仅在定义它的翻译单元中可见

现在,由于函数是在头文件中定义的,
static
关键字的作用是,编译器将在包含头文件(以及实际使用该函数)的每个翻译单元中为函数生成代码。此外,该函数将被内联

对于模板函数,我认为使用
静态
内联
或不使用关键字会产生相同的结果;事实上,在所有情况下,函数都是内联的,不会出现多定义错误


因此,有趣的问题可能是“为什么在非模板函数上使用
静态

静态函数的使用是在我们的代码编译时,静态代码将被执行。
因此,所有静态函数的链接都是在编译时完成的。

一个定义规则?请参阅:PS。我认为您的问题与模板无关,而与静态修改器无关…@KerrekSB:这些函数已经是内联函数,因此不会破坏ODR。非静态函数
minmax
呢?有什么特别的吗?@nn0p就像我说的,结果是一样的。“特别的”是,如果minmax是一个非模板函数,您将被迫在签名中添加“static”或“inline”。您的回答在我看来是错误的和荒谬的。1) 静态函数在编译时不求值。编译时只计算常量表达式和函数。2) 所有函数都在编译时链接(编译二进制文件时)。您可能错过了术语静态/动态链接和术语静态/动态绑定(这是关于虚拟函数的)?