构造函数中的 const_cast 可接受

发布于 2024-10-13 07:59:46 字数 374 浏览 2 评论 0原文

这是 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ぺ禁宫浮华殁 2024-10-20 07:59:46

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

Assuming that _swap_suffix_extension is a const std::string then why not just do this:

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

Then you can totally avoid the const_cast ...

不知在何时 2024-10-20 07:59:46

只要有可能,就避免使用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) ) 
{} 

这样做的成本只是编写一个 free (static 或在未命名的命名空间中)实现文件中的函数,如果为该函数选择正确的名称,则结果是可读的。在您的情况下: concatenateconcat 将是不错的选择。

虽然在示例中使用 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:

// 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) ) 
{} 

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 or concat 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文