我可以在以下情况下调用 foo(const T*&) 吗?
#include <iostream>
template <typename T>
void foo(const T*&)
{
std::cout << "::foo(const T*&) \n";
}
template <typename T>
void foo(const T&)
{
std::cout << "::foo(const T&) \n";
}
我可以在以下情况下调用 foo(const T*&) 吗?
#include <iostream>
template <typename T>
void foo(const T*&)
{
std::cout << "::foo(const T*&) \n";
}
template <typename T>
void foo(const T&)
{
std::cout << "::foo(const T&) \n";
}
您对以下事实感到困惑const T*&
:指向 的指针的引用const T
,而不是指向 的指针的 const 引用T
。
要调用该版本的foo
,请使用
int main()
{
const int *iptr = 0;
foo(i);
return 0;
}
或者(并且可能按照预期),将函数签名更改为T *const &
,即对指向 的指针的 const 引用T
。
不,您不能使用该代码,因为存在隐式转换,您最终将调用 foo(const T&) 版本。如果要分离这两种行为,请使用显式:
template <typename T>
void foo(const T*&)
{
std::cout << "::foo(const T*&) \n";
}
template <typename T>
void foo(explicit const T&)
{
std::cout << "::foo(const T&) \n";
}
int main()
{
int x;
int *y=&x;
foo(x);
foo(y);
return 0;
}
这样 foo(x) 将调用 foo(const T&),而 foo(y) 将调用 foo(const T*&)