gpt4 book ai didi

c++ - 编译如何选择调用哪个模板函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:04 26 4
gpt4 key购买 nike

对于下面的代码,编译器是如何选择调用哪个模板函数的?如果省略 const T& 函数,则始终调用 T& 函数。如果省略 T& 函数,则始终调用 const T& 函数。如果两者都包含,则结果如下。

#include <iostream>
#include <typeinfo>

template <typename T>
void function(const T &t)
{
std::cout << "function<" << typeid(T).name() << ">(const T&) called with t = " << t << std::endl;
}

template <typename T>
void function(T &t)
{
std::cout << "function<" << typeid(T).name() << ">(T&) called with t = " << t << std::endl;
}

int main()
{
int i1 = 57;
const int i2 = -6;

int *pi1 = &i1;
int *const pi3 = &i1;
const int *pi2 = &i2;
const int *const pi4 = &i2;

function(pi1); ///just a normal pointer -> T&
function(pi2); ///cannot change what we point to -> T&
function(pi3); ///cannot change where we point -> const T&
function(pi4); ///cannot change everything -> const T&

return 0;
}

/* g++ output:
function<Pi>(T&) called with t = 0x22cd24
function<PKi>(T&) called with t = 0x22cd20
function<Pi>(const T&) called with t = 0x22cd24
function<PKi>(const T&) called with t = 0x22cd20
*/

/* bcc32 output:
function<int *>(T&) called with t = 0012FF50
function<const int *>(T&) called with t = 0012FF4C
function<int *>(const T&) called with t = 0012FF50
function<const int *>(const T&) called with t = 0012FF4C
*/

/* cl output:
function<int *>(T&) called with t = 0012FF34
function<int const *>(T&) called with t = 0012FF28
function<int *>(const T&) called with t = 0012FF34
function<int const *>(const T&) called with t = 0012FF28
*/

最佳答案

Here是编译器所经历的过程的简要总结。它并未涵盖所有内容,但可以帮助您入门。

在这种情况下,决策与非模板函数相同。给定 void f(int&)void f(const int&),第一个将为常规整数选择,第二个为常量整数。参数以这种方式更好地匹配输入:如果您提供一个可以修改的变量,它会调用一个可以修改它们的函数,如果您提供一个您不能修改的变量,它会调用一个不能修改它们的函数。

在您的示例代码中,pi2 被声明为 const int *,是指向常量数据的非常量指针。因此在您的函数中,您可以更改 t,但不能更改 *t。相比之下,pi3 是指向非常量数据的常量指针。所以您可以更改 *t 但不能更改 t

如果您稍微更改了代码:

function(*pi1);
function(*p12);
function(*pi3);
function(*pi4);

在这种情况下,第一个和第三个都将解析为 T& 版本,因为 *pi1*pi3 都是类型int& 因此可以修改。 *pi2*pi4 都是 const int&,因此它们解析为 const T& 重载。

关于c++ - 编译如何选择调用哪个模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2708948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com