构造函数中的const_cast可以接受

时间:2011-01-21 09:38:19

标签: c++ const-correctness

这是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 个答案:

答案 0 :(得分:7)

假设_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 ......

答案 1 :(得分:2)

尽可能避免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或未命名的命名空间)函数,如果为函数选择正确的名称,则结果可读。在您的情况下:concatenateconcat将是不错的选择。

虽然在示例中使用const_cast不会导致未定义的行为,但我会出于个人原因避免使用它。使用C ++编写(与C或Java相比)是很麻烦的,原因是:这样他们就会引起程序员的注意:这里发生了一些奇怪的事情!如果你开始播放模型,那么你会习惯看到它们,它们会变得很自然。