【问题标题】:const correctness for custom reference wrapper自定义引用包装器的 const 正确性
【发布时间】:2020-08-26 16:35:00
【问题描述】:

我在通过网络发送数据时使用boost::variant 来实现类型擦除。当数据到达客户端或服务器时,我正在检查其结构以检索基础信息并在结构与 API 中约定的结构不匹配时报告错误。为此,我创建了一个轻量级引用包装器,它包含对变体的引用,并为结构检查和类型转换提供了方便的接口。

using value_t = boost::make_recursive_variant< /*types, some of them recursive*/ >::type;

class view_t {
public:
  /*non-const methods to access value_*/
private:
  value_t& value_;
};

class cview_t {
public:
  /*const methods to access value_*/
private:
  const value_t& value_;
};

view_t   view(value_t& v){ return v; }
cview_t cview(const value_t& v){ return v; }
cview_t cview(value_t&& v) = delete;
cview_t cview(const value_t&& v) = delete;

不幸的是,这个接口被证明很麻烦,因为每个具有view 成员的聚合类型都需要遵循相同的 const/non-const 拆分。我想知道将这两个类合并到一个视图中并在创建这样的视图的方法中使用 const_cast 是否合法:

class view_t {
public:
  /*const and non-const methods to access value_*/
private:
  value_t& value_;
};

      view_t view(value_t& v){ return v; }
const view_t cview(const value_t& v){ return const_cast<value_t&>(v); }
const view_t cview(value_t&& v) = delete;
const view_t cview(const value_t&& v) = delete;

【问题讨论】:

    标签: c++ constants const-correctness reference-wrapper


    【解决方案1】:

    返回 const 对象大多是无用的,因为

    auto /*view_t*/ my_view = cview(some_value); // legal
    

    所以你失去了你的坚持。

    修改 const 值是未定义的行为,

    您的视图可以用于通向 UB。

    但只要你不修改 const 对象,你就“很好”。

    分成 2 个类更安全,因为它不会被滥用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2016-04-09
      • 2021-02-13
      • 2013-10-31
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多