由于 const,无法在构造函数中转换参数

Unable to convert parameter in constructor due to const

在我的软件中我有一个三角形,一个页面包含一个三角形。我想构建一个页面,给它一个三角形和其他数据。

class Triangle
{
public:
    const int **m_apVertex;
    Triangle(const int * apVertex[])
    {
        m_apVertex=apVertex;
    }
};

struct args
{
    int ** vertices;
    // ... other data
};

class Page
{
public:
    Triangle m_t;

    Page(const args conArgs):
        //m_t(const_cast<const INT **>(conArgs.vertices))
        m_t(conArgs.vertices)
    {
    }
};

void main()
{
    args a;
    Page p(a);
}

编译失败:

error C2664: 'Triangle::Triangle(const int *[])' : cannot convert parameter 1 from 'int **const ' to 'const int *[]'

作为修复,我使用 m_t(const_cast<const INT **>(conArgs.vertices)) 但我不确定为什么没有 const_cast;

它就不能工作

改一下就够了:

const int **m_apVertex;
Triangle(const int * apVertex[])

 int **m_apVertex;
Triangle( int * apVertex[])

或者如果你不想碰它,那么改变:

struct args
{
    int ** vertices;

struct args
{
    const int ** vertices;

一些附加信息:

const int **m_apVertex;
^^^^^~~ this const is known as low-level const

const int ** const apVertex
             ^^^^^~~ this const is known as top-level const

top-level const用于表示指针(整个对象)本身是一个const。如果指针指向的对象是const,那么我们称它为低级const。

现在当我们复制一个对象时,顶级常量会被忽略,所以下面是有效的:

void foo(int* pi) {}
int main() {
    int* const pi=0;
    foo(pi);
}

与您的情况相同。但是低级常量永远不会被忽略,所以你不能这样做:

const int ** cvertices;
int ** vertices;
vertices = cvertices;