简体   繁体   中英

Cast constexpr int[] to void*

I have a static array of integers that I never want to change. I have a C-style function that wants to have this array as a void-pointer parameter. I am trying out different combinations of const_cast and reinterpret_cast, but I'm coming to the point where I have no clue of what I'm exactly doing and it keeps giving me errors.

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

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

invalid const_cast from type 'const int ( )[3]' to type 'int '

I see that it fails because the types don't match. I also tried const_cast<int[]>(bar) , but const_cast wants to have a pointer or reference type.

Where can I read up on this subject? It's hard for me to understand what is going on here.

cfunction((void*)bar); 

PS I 've seen lots of programmers struggling to use all these casts when, in reality, they only need the simple C cast. If you insist on the C++ cast style, then

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

(Remove the & from bar).

As the compiler says, &bar is a const int (*)[3] - a pointer to an array - and you can't const_cast that to an int* .

You want a pointer to the array's first element, not to the array.
That is,

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

or, equivalently,

const_cast<int*>(bar)

Of course, this will only be valid if the C function doesn't ever modify the array.
If there is any risk of that, you should not make it const.

If the C function was promising to not modify the data, then it would be taking a const void* . Since it doesn't, it might modify it. So don't make your array const :

class Foo
{
    static int bar[3];

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

And define the array in the .cpp file of your class:

int Foo::bar[3] = {1, 2, 3};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM