2

在 C++ 11 之前,我经常需要实现一个方法的两个非常相似的变体来处理类/结构的 const 和非 const 使用场景:

struct my_struct_t{
     ....
     float_t& at( uint32_t row, uint32_t col)
     {
         return *(((float_t*)((uint8_t*)numbers+row*row_stride)) + col);
     }

     float_t const& at( uint32_t row, uint32_t col) const
     {
         return *(((float_t*)((uint8_t*)numbers+row*row_stride)) + col);
     }

};

这在 C++ 11 中是否发生了变化?

4

3 回答 3

2

没有
这在标准库中很明显(它仍然使用显式const方法)。

于 2012-10-22T06:05:13.483 回答
2

这在 C++11 中没有改变,但在 C++17 中发生了改变:

T const & f() const {
    return something_complicated();
}
T & f() {
    return const_cast<T &>(std::add_const(*this).f());
}

请参阅如何删除类似的 const 和非 const 成员函数之间的代码重复?

编辑

自从发表这篇文章以来,我已经改变了几次立场。上面的文字反映了我目前的想法。我之前的位置是两个演员都偏爱,而const_cast我原来的位置是。更安全,因为它唯一能做的就是添加/删除和限定符。可能会以其他方式意外施放。我最初的想法是更喜欢添加,因为它将最可能的“安全”添加操作与可能危险的删除操作区分开来。上面代码中的版本具有由 说明的安全操作,它只能执行我想要的操作,而将潜在的不安全作为确保您正确完成操作的唯一需要。static_castconst_castconst_castconstvolatilestatic_caststatic_castconstconstconststd::as_constconst_cast

于 2012-10-23T04:09:41.593 回答
-2

我不认为有必要摆脱“不实现 2 个变体”。

  1. 如果两个变体都在做不同的事情,那么您必须保留它们
  2. 如果两个变体都在做同样的事情,那么删除非常量版本并只维护const版本

顺便说一句,如果需要的话,还有第 3 和第 4 种变体:

float_t& at( uint32_t row, uint32_t col) volatile;
float_t& at( uint32_t row, uint32_t col) const volatile;

[注意:不相关,但在 C++11 中,所有变体都可以添加noexcept关键字以获取异常相关信息:

float_t& at( uint32_t row, uint32_t col) noexcept;

]

于 2012-10-22T06:17:45.437 回答