如果是采用STD裁判的必要::?(When is the use of std::ref neces

2019-06-26 19:54发布

考虑:

std::tuple<int , const A&> func (const A& a) 
{
  return std::make_tuple( 0 , std::ref(a) );
}

std::ref需要编写正确的和便携式的代码? (它编译罚款没有它)

背景:

如果我删除std::ref我的代码建立罚款没有任何警告( g++-4.6 -Wall ),但不能正常运行。

在利益的界定情况A

struct A {
  std::array<int,2> vec;
  typedef int type_t;

  template<typename... OPs,typename... VALs>
  A& operator=(const std::pair< std::tuple<VALs...> , std::tuple<OPs...> >& e) {
    for( int i = 0 ; i < vec.size() ; ++i ) {
      vec[i] = eval( extract(i,e.first) , e.second );
    }
  }
};

Answer 1:

  • make_tuple(0, a)使一个tuple<int, A>
  • make_tuple(0, ref(a))使一个tuple<int, reference_wrapper<A>>
  • 你也可以说tuple<int, A&> t(0, a); 一个元组,你不能让make_tuple ,或使用std::tie


Answer 2:

std::ref没有作个参考,让您的代码示例中它不会做你期望的。 std::ref创建行为类似于参考的对象。 当你想实例化一个函子,并通过它的一个参考样版,以一个标准库算法可能是有用的,例如,。 由于算法的值取函子,你可以使用std::ref包函子。



Answer 3:

一个,其中该示例的std::ref是必要的:

void update(int &data)  //expects a reference to int
{
    data = 15;
}
int main()
{
    int data = 10;

    // This doesn't compile as the data value is copied when its reference is expected.
    //std::thread t1(update, data);         

    std::thread t1(update, std::ref(data));  // works

    t1.join();
    return 0;
}

所述std::thread构造拷贝所提供的值,而不转换为预期的参数类型(这是在这种情况下引用类型,见update() 因此,我们需要包装,真正需要在引用参数 std::ref



文章来源: When is the use of std::ref necessary?