const_cast does not work to remove constness in argument

Dear fellow PH-users,

When using std::seach_n in a const-correct way I ran into problems. I found a workaround, but I hope one of you can give an in-depth explanation.

The following code should compile, but it doesn't (under the IDE C++ Builder 6.0 Enterprise edition with the Borland compiler BCB.exe version 6.0.10.157):

[code]
const std::string s = "abc***def";
const int n = 3; //Number of repeats
std::search_n( s.begin(),s.end(),n,'*');
[/code]

The compile-error given is 'Cannot modify const object', because 'n' is of type 'const int'. Although the real problem is in the std::search_n algorithm, I use the following workaround:

[code]
const std::string s = "abc***def";
const int n = 3; //Number of repeats
std::search_n( s.begin(),s.end(),static_cast(n),'*');
[/code]

Due to the static_cast to integer type, this compiles nicely. But what I also tried is to const_cast the const integer n to integer type, as below:

[code]
const std::string s = "abc***def";
const int n = 3; //Number of repeats
std::search_n( s.begin(),s.end(),const_cast(n),'*');
[/code]

This again gives the compile-error 'Cannot modify const object'.

IMHO the const_cast is better then the static_cast (because I want the constness away).

So my question is: why does static_cast work and why doesn't const_cast work?

Thanks in advance, Bilderbikkel

Comments

  • Answer by Sergey (thanks!):

    As section 5.2.11 Const cast [expr.const.cast] of ISO C++ standard suggests, there are limited amount of conversion that can be performed using const_cast, so const_cast operator can be briefly described as applicable to two pointers to the same type with various cv-qualifiers. So point is that you can't const_cast to any type other that pointer or reference.

    And static_cast worked becouse it created new temporary object from existing one, it is was similar to use "const int n = 10; search_n( s.begin(), s.end(), int( n), '*');". But I suppose that these casts are redundant becouse arguments are passed by value so algorithm don't affects "outer" variables.
Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

In this Discussion