首页 > 解决方案 > 基于 const 限定实例化的模板特化

问题描述

假设我有一个模板类:

template<typename T>
class A
{
    public:
        A(T& val) : m_val{val} {}

        T& val() { return m_val; }
        const T& val() const { return m_val; }

        //etc...
    private:
    T& m_val;
};

我可以对第 (1) 行和 (2) 行进行不同的模板专业化:

    int a = 5;
    A<int> x {a}; //(1)
    const A<int> y {a}; //(2)

    const int b = 10;
    const A<int> z {b}; //error: binding reference of type ‘int&’ to ‘const int’ discards qualifiers

基本上,在const我想将底层声明为的情况下m_valconst T& m_val;因为我已经实例化了我的包装类,const并且我想表明内部引用也应该const在这种情况下。

这可能吗?我尝试了几种解决方案,唯一可行的方法是显式添加const到模板参数中,如下所示:const A<const int> z {b}; 是否可以避免这种内部 const 限定符?

编辑:将成员变量更改为引用,以显示在这种情况下 const-ness 如何给编译器带来麻烦。

EDIT2:删除了默认构造函数以简化问题。

标签: c++templatesconstants

解决方案


推荐阅读