将constexpr int []转换为void * {

时间:2019-06-18 08:23:41

标签: c++

我有一个整数的静态数组,我从不想更改。我有一个C样式的函数,想要将此数组作为空指针参数。我正在尝试const_cast和reinterpret_cast的不同组合,但是到了我无法确切知道自己在做什么的地步,并且不断出现错误。

class Foo
{
    static constexpr int bar[3] = {1,2,3};

    void method()
    {
        cfunction(reinterpret_cast<void*>(const_cast<int*>(&bar)));
    }
};
  

从类型'const int()[3]'到类型'int '

的无效const_cast

我看到它失败了,因为类型不匹配。我也尝试过const_cast<int[]>(bar),但是const_cast想拥有一个指针或引用类型。

我在哪里可以读到这个主题?我很难理解这里发生了什么。

3 个答案:

答案 0 :(得分:4)

cfunction((void*)bar); 

P.S。我已经看到很多程序员在实际上只需要简单的C转换时就难以使用所有这些转换。如果您坚持使用C ++强制转换样式,那么

cfunction(reinterpret_cast<void*>(const_cast<int*>(bar)));

(从栏中删除&)。

答案 1 :(得分:3)

正如编译器所说,&barconst int (*)[3]-指向数组的指针-并且您不能const_cast指向int*

您想要一个指向数组第一个元素的指针,而不是指向数组的指针。
也就是说,

const_cast<int*>(&bar[0])

或等效地

const_cast<int*>(bar)

当然,这仅在C函数从未修改过数组的情况下才有效。
如果存在任何风险,则不应将其设置为常量。

答案 2 :(得分:2)

如果C函数承诺不修改数据,则它将采用<Country>。既然没有,它可能会对其进行修改。因此,请勿将数组设为<Row_entry> <Employees> <Emp> <Emp_id>E1</Emp_id> <Emp_Name>Name1</Emp_Name> <Country>C1</Country> <AIB_Position> <AIB>1500</AIB> </AIB_Position> </Emp> <Emp> <Emp_id>E2</Emp_id> <Emp_Name>Name2</Emp_Name> <Country>C2</Country> <AIB_Position> <AIB>1800</AIB> </AIB_Position> </Emp> </Employees> </Row_entry>

const void*

并在您的课程的const文件中定义数组:

class Foo
{
    static int bar[3];

    void method()
    {
        cfunction(bar);
    }
};