c++ - 模板参数的 const 关键字在函数重载解析中的奇怪行为
问题描述
所以我一直在阅读Programming Principles and Practices in C++
Bjarne。基类/派生类的模板化对象的转换部分让我有点困惑。所以我尝试尝试不同的组合并偶然发现了一些奇怪的东西
#include <iostream>
class A {
public:
int i;
};
class B : public A {
int j;
};
template<typename T>
class Array_ref{
public:
Array_ref(T* pointer, int size) : p{pointer}, sz{size} {}
template<typename Q>
operator Array_ref<const Q>(){
static_cast<Q>(*static_cast<T*>(nullptr));
return Array_ref<const Q>{reinterpret_cast<Q*>(p), sz};
}
T& operator[](int n){
return p[n];
}
private:
T* p;
int sz;
};
void test_function(Array_ref<A* const> temp){
if(temp[0]->i)
std::cout<<"failed I guess"<<std::endl;
exit(0);
};
int main(){
B* testobj[1];
testobj[0] = new B;
testobj[0]->i = 0;
Array_ref<B*> a(testobj, 1);
test_function(a);
delete testobj[0];
exit(0);
}
这void test_function(Array_ref<A* const> temp)
是困扰我的线。因为如果我做到了,Array_ref<const A*>
它无法编译并出现无法从B*
to转换的错误const A*
,尽管据我所知,我已经提供了应该适合重载参数的转换规则。事实上,不是const A*
和A* const
非常不同的东西吗?
如果有人能帮我解决我在哪里搞砸了,我会很高兴,我错过了什么。非常感谢!
解决方案
是的,const A*
而且A* const
是非常不同的东西,这就是为什么您的转换运算符Array_ref<const Q>
无法满足 type 参数的原因Array_ref<const A*>
。
如果Q = A*
,则const Q
= Q const
= A* const
。
推荐阅读
- php - 如何使用 PHP-SDK v2 API 转移呼叫
- api - 在组合服务中管理多个订阅密钥
- javascript - 验证错误甚至是 Selenium 选择的下拉值
- c++ - 查找具有 n 个 int 类型元素的 3 个向量的出现次数最多的总和
- flutter - 颤振中的国际化未按预期工作
- python - 在 Django Factory Boy 中,是否可以为某个实例指定自定义 FactoryOptions?
- python - 更改具有条件的数据框列
- android - 我可以为 Android 和/或 iOS 创建基于 Python 代码的可执行代码吗?
- django - 在 Heroku 上使用 django-pipeline 运行 collectstatic 的权限被拒绝
- r - 提取部分变量名以在函数中使用