33

検討:

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 );
    }
  }
};
4

4 に答える 4

27

std::ref必要な例の1つ:

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

于 2017-08-22T17:19:22.063 に答える
19

std::refは参照を作成しないため、コードサンプルでは期待どおりに機能しません。std::ref参照と同様に動作するオブジェクトを作成します。たとえば、ファンクターをインスタンス化し、そのリファレンスのようなバージョンを標準ライブラリアルゴリズムに渡す場合に便利です。std::refアルゴリズムはファンクターを値で取得するため、ファンクターをラップするために使用できます。

于 2012-08-06T17:35:21.110 に答える
18
  • 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
于 2012-08-06T17:32:34.637 に答える
0

タイトル()の質問に答える:オブジェクトへの参照のリストをループしてそれらを変更する場合に役立つWhen is the use of std::ref necessary?もう1つのケースは次のとおりです。std::ref

std::vector<int> v1, v2;
  
void test() {
  for (std::vector<int>& vv : 
    // Compiles
    { std::ref(v1), std::ref(v2) } 
  
    // Compiler rejects this with:
    //   binding reference of type 'vector<...>' to value of 
    //   type 'const vector<...>' drops 'const' qualifier 
    // { v1, v2} 
  ) {
      vv.push_back(3);
  }
}

リストで使用std::refしないと、オブジェクトは変更できないものとして扱われconst、変更できません(https://godbolt.org/z/Ta6YM31KMも参照)。

于 2021-12-23T11:04:28.997 に答える