问题
In C++ I have a function that only requires read-only access to an array but is mistakenly declared as receiving a non-const pointer:
size_t countZeroes( int* array, size_t count )
{
size_t result = 0;
for( size_t i = 0; i < count; i++ ) {
if( array[i] == 0 ) {
++result;
}
}
return result;
}
and I need to call it for a const array:
static const int Array[] = { 10, 20, 0, 2};
countZeroes( const_cast<int*>( Array ), sizeof( Array ) / sizeof( Array[0] ) );
will this be undefined behaviour? If so - when will the program run into UB - when doing the const_cast and calling the functon or when accessing the array?
回答1:
Yes, it is allowed (if dangerous!). It's the actual write to a const
object that incurs undefined behaviour, not the cast itself (7.1.5.1/4 [dcl.type.cv]).
As the standard notes in 5.2.11/7 [expr.const.cast], depending on the type of the object an attempt to write through a pointer that is the result of casting away const
may produce undefined behaviour.
回答2:
Since your code does not modify the array, and you told the compiler you know what you are doing by using the const_cast
, you will actually be OK. However, I believe you are technically invoking undefined behaviour. Best to get the function declaration fixed, or write, declare and use the const-safe version of it.
回答3:
Yes, you can do that. No, it is not undefined behavior as long as the function truely does not try to write to the array.
回答4:
The problem of const_cast
is always the same -- it allows you to "break the rules", just like casting to and from void*
-- sure you can do that, but the question is why should you?
In this case it's of course ok, but you should ask yourself why didn't you declare size_t countZeroes( const int* array, size_t count )
in the first place?
And as a general rule about const_cast
:
- It may produce hard to find bugs
- You're throwing away the const-agreement with the compiler
- Basically you're turning the language into a lower-level one.
回答5:
Using const_cast
on an object which is initially defined as const
is UB, therefore the undefined behaviour comes about immediately at the point you call const_cast
.
来源:https://stackoverflow.com/questions/1542200/is-using-const-cast-for-read-only-access-to-a-const-object-allowed