Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

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++ 为什么编译器不能用literal确定std::max的模板?_C++_Templates_Stl_Compiler Errors_Overloading - Fatal编程技术网

C++ 为什么编译器不能用literal确定std::max的模板?

C++ 为什么编译器不能用literal确定std::max的模板?,c++,templates,stl,compiler-errors,overloading,C++,Templates,Stl,Compiler Errors,Overloading,无论是clang还是gcc,都要编译以下内容: #include <algorithm> int main() { size_t t = 1; t = std::max(t,0); } 如果我显式地提供模板类型,它可以工作: #include <algorithm> int main() { size_t t = 1; t = std::max<size_t>(t,0); } 这很令人困惑,因为如果我将size\u t与0进行比较,两个编译

无论是clang还是gcc,都要编译以下内容:

#include <algorithm>
int main()
{
  size_t t = 1;
  t = std::max(t,0);
}
如果我显式地提供模板类型,它可以工作:

#include <algorithm>
int main()
{
  size_t t = 1;
  t = std::max<size_t>(t,0);
}
这很令人困惑,因为如果我将size\u t与0进行比较,两个编译器都不会抱怨警告,就像我将size\u t与int进行比较一样。然后我推断编译器可以找出将0与size\u t进行比较是有意义的,那么是什么阻止编译器找出要使用哪个max呢?

std::max只有一个模板参数,用于两个参数。当您在没有显式指定该参数的情况下调用函数时,它会尝试从两个参数中推断出该函数,最后一个参数的推断结果是size_t,另一个参数的推断结果是int,因为这是两个参数的类型,并且不知道您想要哪一个

但是,可以肯定的是,在您切断位置之后,Clang的错误消息中有一部分确实指出了这一点。

std::max只有一个模板参数,用于两个参数。当您在没有显式指定该参数的情况下调用函数时,它会尝试从两个参数中推断出该函数,最后一个参数的推断结果是size_t,另一个参数的推断结果是int,因为这是两个参数的类型,并且不知道您想要哪一个


非常肯定,在您切断位置后,Clang的错误消息中的一部分确实说明了这一点。

litwral的类型为int。匹配T,T的模板不会进行转换。

litwral的类型为int。匹配T的模板,T不会进行转换。

因为一个参数是size\T,一个是int。将0显式转换为size\T也可以。@Yakk,edited。现在匹配了。因为一个参数是size\u t,另一个是int。显式地将0转换为size\u t也可以。@Yakk,edited。现在它匹配了。@Sebatsion Redl,有没有任何理由认为使用两个模板参数实现std::max是个坏主意?为什么不将大小t与int进行比较?@mangledorf:因为t maxT,t有一个返回类型。退货类型是什么??maxT1,T2?考虑STD::MaxTimTyxMax,IntIn Min和STD::MuuUnTimax,InthMix.@ MalSalter,而对于数字类型,可以使用一些智能模板元编程来找到正确的类型,以返回哪种类型的MAX值越大,Max越高,另一个问题是Max实际上获取并返回引用,如果这两种类型是不同的,那就不起作用了。@SebastianRedl:当然,您可以决定这两种类型std::max按值返回。但是,我不希望使用最大值最高的类型,我希望使用decltypeT1+T2@SebatsionRedl,使用两个模板参数实现std::max会是一个坏主意吗?为什么不将大小t与int进行比较?@mangledorf:因为t maxT,t有一个返回类型。退货类型是什么??maxT1,T2?考虑STD::MaxTimTyxMax,IntIn Min和STD::MuuUnTimax,InthMix.@ MalSalter,而对于数字类型,可以使用一些智能模板元编程来找到正确的类型,以返回哪种类型的MAX值越大,Max越高,另一个问题是Max实际上获取并返回引用,如果这两种类型是不同的,那就不起作用了。@SebastianRedl:当然,您可以决定这两种类型std::max按值返回。但是,我不希望使用最大值最高的类型,我希望使用decltypeT1+T2
#include <algorithm>
int main()
{
  size_t t = 1;
  t = std::max<size_t>(t,0);
}