构造函数中的 const_cast 可接受
Posted
技术标签:
【中文标题】构造函数中的 const_cast 可接受【英文标题】:const_cast in constructor acceptable 【发布时间】:2011-01-21 09:38:19 【问题描述】:这是对 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);
是的,字符串永远不会改变。
【问题讨论】:
【参考方案1】:假设 _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 ...
【讨论】:
只是为了记录,冒着让初学者更困惑的风险,但更简洁,你可以让字符串连接的一侧是一个 std::string 对象:@ 987654322@. 如果我没有一个被定义为字符串的对象,那么在构造函数主体中使用 const_cast 是否可以接受? @Tony:是的,我知道,我差点就离开了。我只是认为上面的内容更明显。我想它可能会更慢,但这取决于“std::string::operator + (std::string, char*)”是否在使用普通(std::string, std::string ) 添加与否... 顺便说一句/另一种方法是使 swap_suffix 和/或扩展参数const std::string&
- 然后您不仅仍然可以传递 char* 值并隐式构造字符串,而且您可以将它们连接起来而不需要任何不直观的代码。
@Hassan:在我看来(人们可能不同意)你永远不应该使用 const_cast。如果你需要使用它,那么你的设计就有缺陷。事实上,它只是被引入来处理没有以适当的 const 正确性编写库的情况。这样,您实际上可以继续生活,而不必提出请求来修复库代码(如果它确实受到积极支持的话)。【参考方案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 相比)编写强制转换很麻烦,原因是:它们会引起程序员的注意:这里发生了一些奇怪的事情!如果你开始使用强制转换,那么你会习惯于看到它们,它们会变得自然。
【讨论】:
以上是关于构造函数中的 const_cast 可接受的主要内容,如果未能解决你的问题,请参考以下文章