这是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);
}
是的,字符串永远不会改变。
答案 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
或未命名的命名空间)函数,如果为函数选择正确的名称,则结果可读。在您的情况下:concatenate
或concat
将是不错的选择。
虽然在示例中使用const_cast
不会导致未定义的行为,但我会出于个人原因避免使用它。使用C ++编写(与C或Java相比)是很麻烦的,原因是:这样他们就会引起程序员的注意:这里发生了一些奇怪的事情!如果你开始播放模型,那么你会习惯看到它们,它们会变得很自然。