构造函数中的 const_cast 可接受
这是 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);
}
是的,字符串永远不会改变。
Is this a valid use of a const_cast ? I am using it in a constructor and it looks as follows:
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);
}
Yes, the strings will never change.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
假设 _swap_suffix_extension 是一个 const std::string 那么为什么不这样做:
那么你就可以完全避免 const_cast ...
Assuming that _swap_suffix_extension is a const std::string then why not just do this:
Then you can totally avoid the const_cast ...
只要有可能,就避免使用const_cast,对于任何给定的类型来说,这都是可能的。只需创建一个辅助函数,它接受两个参数,组成常量的最终值并在初始化程序中使用它:
这样做的成本只是编写一个 free (
static
或在未命名的命名空间中)实现文件中的函数,如果为该函数选择正确的名称,则结果是可读的。在您的情况下:concatenate
或concat
将是不错的选择。虽然在示例中使用 const_cast 不会导致未定义的行为,但出于个人原因我会避免使用它。用 C++ 编写强制转换很麻烦(与 C 或 Java 相比),原因是:这样它们会引起程序员的注意:这里发生了一些奇怪的事情! 如果您开始进行强制转换,那么你会习惯看到它们,它们就会变得自然。
Whenever possible avoid the
const_cast
, and here it is quite possible for any given type. Just create a helper function that takes the two arguments, composes the final value of the constant and use it in the initializer:The cost of that is just writting a single free (
static
or in an unnamed namespace) function in the implementation file, and the result it readable if you choose a proper name for the function. In your case:concatenate
orconcat
would be good choices.While the use of
const_cast
in the example will not lead to undefined behavior, I would avoid it for personal reasons. Casts are cumbersome to write in C++ (compare with C or Java) for a reason: so that they will call the attention of the programmer: something weird is going on here! If you start sprinkling casts, then you will get used to seeing them, and they will become natural.