Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自定义引用包装器的常量正确性_C++_Constants_Const Correctness_Reference Wrapper - Fatal编程技术网

C++ 自定义引用包装器的常量正确性

C++ 自定义引用包装器的常量正确性,c++,constants,const-correctness,reference-wrapper,C++,Constants,Const Correctness,Reference Wrapper,我使用boost::variant在通过网络发送数据时实现类型擦除。当数据到达客户机或服务器时,我检查其结构以检索底层信息,并在结构与API中约定的结构不匹配时报告错误。为此,我创建了一个轻量级引用包装器,它保存对变体的引用,并为结构检查和类型转换提供了一个方便的接口 using value_t = boost::make_recursive_variant< /*types, some of them recursive*/ >::type; class view_t { pub

我使用
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;

返回const对象基本上是无用的,因为

auto /*view_t*/ my_view = cview(some_value); // legal
所以你失去了理智

修改常量值是未定义的行为

您的视图可以以导致UB的方式使用

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


分为两个类更安全,因为它不能被滥用。

返回const对象基本上是无用的,因为

auto /*view_t*/ my_view = cview(some_value); // legal
所以你失去了理智

修改常量值是未定义的行为

您的视图可以以导致UB的方式使用

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

分为两类比较安全,因为它不会被误用