我有一个整数的静态数组,我从不想更改。我有一个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
想拥有一个指针或引用类型。
我在哪里可以读到这个主题?我很难理解这里发生了什么。
答案 0 :(得分:4)
cfunction((void*)bar);
P.S。我已经看到很多程序员在实际上只需要简单的C转换时就难以使用所有这些转换。如果您坚持使用C ++强制转换样式,那么
cfunction(reinterpret_cast<void*>(const_cast<int*>(bar)));
(从栏中删除&)。
答案 1 :(得分:3)
正如编译器所说,&bar
是const 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);
}
};