首页 > 解决方案 > 模板参数的 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非常不同的东西吗?

如果有人能帮我解决我在哪里搞砸了,我会很高兴,我错过了什么。非常感谢!

标签: c++templatesc++14overloading

解决方案


是的,const A*而且A* const是非常不同的东西,这就是为什么您的转换运算符Array_ref<const Q>无法满足 type 参数的原因Array_ref<const A*>

如果Q = A*,则const Q= Q const= A* const


推荐阅读