const_cast в конструкторе допустим - PullRequest
1 голос
/ 21 января 2011

Это допустимое использование const_cast?Я использую его в конструкторе и он выглядит следующим образом:

KeyLiteObject(const char * extension, const char * swap_suffix)
        :    _extension(extension),
             _swap_suffix(swap_suffix),
             _swap_suffix_extension(swap_suffix) 
{
    const_cast<std::string*>(&_swap_suffix_extension)->append(_extension);
}

Да, строки никогда не изменятся.

Ответы [ 2 ]

7 голосов
/ 21 января 2011

Если предположить, что _swap_suffix_extension является const std :: string, то почему бы просто не сделать это:

KeyLiteObject(const char * extension, const char * swap_suffix)
        :    _extension(extension),
             _swap_suffix(swap_suffix),
             _swap_suffix_extension( std::string( swap_suffix ) + std::string( extension ) ) 
{
}

Тогда вы можете полностью избежать const_cast ...

2 голосов
/ 21 января 2011

По возможности избегайте const_cast, и здесь это вполне возможно для любого данного типа.Просто создайте вспомогательную функцию, которая принимает два аргумента, составляет окончательное значение константы и использует его в инициализаторе:

// header file
struct test { 
   const type x; 
   test( type const & a, type const & b );
};
// implementation file
namespace {
   type compose( type const & arg1, type const & arg2 ) {
      // calculate the actual value here
   }
}
test::test(type const & a, type const & b) 
      : x( compose(a,b) ) 
{} 

Стоимость этого - просто запись одного свободного (static или вбезымянного пространства имен) в файле реализации, и результат будет читаем, если вы выберете правильное имя для функции.В вашем случае: concatenate или concat будет хорошим выбором.

Хотя использование const_cast в примере не приведет к неопределенному поведению, я бы избегал его по личным причинам.Приводы громоздки для написания на C ++ (сравните с C или Java) по причине: так что они привлекут внимание программиста: что-то странное происходит здесь! Если вы начнете разбрасывать приведение, то выпривыкнет видеть их, и они станут естественными.

...