Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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++类,它们一起工作并实现数据容器(vector)和数据包装器(整数)的分类,这些数据包封装单个向量元素(或者更好地说是访问它)。 该向量只包含int的向量。 整数/包装器提供对int的访问(可能不持有它)_C++ - Fatal编程技术网

避免将左值引用绑定到数据容器和包装器的临时引用的设计 我正在努力设计几个(可能两个)C++类,它们一起工作并实现数据容器(vector)和数据包装器(整数)的分类,这些数据包封装单个向量元素(或者更好地说是访问它)。 该向量只包含int的向量。 整数/包装器提供对int的访问(可能不持有它)

避免将左值引用绑定到数据容器和包装器的临时引用的设计 我正在努力设计几个(可能两个)C++类,它们一起工作并实现数据容器(vector)和数据包装器(整数)的分类,这些数据包封装单个向量元素(或者更好地说是访问它)。 该向量只包含int的向量。 整数/包装器提供对int的访问(可能不持有它),c++,C++,要求: 包装器/整数必须作为左值可用 数据容器应将数据保存为int的向量(而不是整数的向量) 包装器还保存一些其他数据成员(不可能重新解释castint->Integer) 我在设计这个(见下文)时没有遇到左值引用无法绑定到临时引用的问题。我理解这是不可能的,我理解代码是错误的(以及为什么它是错误的)。没有必要解释左值引用不能绑定到右值。我正在努力找到一个解决方案,以满足上述要求,而不是这个问题 如何在C++中进行设计?(可以是任何现代标准) #包括 类整数 { 内部和参考; bool其他数据成

要求:

  • 包装器/整数必须作为左值可用
  • 数据容器应将数据保存为
    int
    的向量(而不是整数的向量)
  • 包装器还保存一些其他数据成员(不可能重新解释cast
    int
    ->Integer)
  • 我在设计这个(见下文)时没有遇到左值引用无法绑定到临时引用的问题。我理解这是不可能的,我理解代码是错误的(以及为什么它是错误的)。没有必要解释左值引用不能绑定到右值。我正在努力找到一个解决方案,以满足上述要求,而不是这个问题

    如何在C++中进行设计?(可以是任何现代标准)

    #包括
    类整数
    {
    内部和参考;
    bool其他数据成员;
    公众:
    整数(int&rhs):ref_t(rhs){}
    整数和运算符=(int i)
    {
    ref_t=i;
    归还*这个;
    }
    };
    类向量
    {
    std::矢量数据;
    公众:
    向量():数据(10){}
    整数和运算符[](整数i)
    {
    返回整数(数据[i]);//注意:这不起作用
    }
    };
    无效写入1(整数和i)
    {
    i=1;
    }
    int main()
    {
    向量v;
    写一个(v[5]);
    }
    
    按值返回“临时”不会复制,甚至不会移动(从C++17开始保证,但在以前的版本中通常作为一致性优化实现)。您必须这样做,因为您的
    操作符[]
    需要为任何索引形成一个新的包装器。(无论
    Integer
    的其他成员如何,
    reinterpret\u cast
    方法都具有未定义的行为)由于生存期延长,通用代码可以将
    自动&&
    绑定到代理对象,并且可以分配给它,因此通常不需要知道代理(这是可取的)


    另外,如果要避免将参数复制到不知道代理类型的函数(如
    write_one
    ),可以接受
    const Integer&
    。要实现这一点,请使您的
    运算符=
    常量(这听起来很奇怪,直到您记住要修改的不是
    整数。

    您可能不希望
    整数
    保留对
    整数的引用。对于POD类型,您不会获得任何效率提升,只会带来麻烦。@sweenish我认为
    Integer
    必须保留该引用,因为数据不属于该类。它属于
    Vector
    类-
    Integer
    仅提供对它的访问。您正在尝试返回对函数local temporary的引用。这绝不是一个好主意。由于您的
    整数
    已经包含引用,只需按值返回它。您可以将其更改为:
    整数运算符[](int i)
    ?@Johnnymop,这是一个有趣的想法。然后需要一个额外的副本,我需要看看Integer的其他数据成员会发生什么。。但这肯定是一个值得尝试的想法!
    #include<vector>
            
    class Integer
    {
      int& ref_t;
      bool other_data_member;
    
    public:
      Integer(int& rhs): ref_t(rhs) {}
    
      Integer& operator=( int i )
      {
        ref_t = i;
        return *this;
      }
    };
    
    
    
    class Vector
    {
      std::vector<int> data;
    
    public:
      Vector(): data(10) {}
      
      Integer& operator[](int i)
      {
        return Integer( data[i] ); // caution: this doesn't work
      }
    };
    
    
    
    void write_one( Integer& i )
    {
      i = 1;
    }
    
    
    int main()
    {
      Vector v;
      write_one( v[5] );
    }