• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <functional>

    std::reference_wrapper::コンストラクタ

    template<class U>
    reference_wrapper(U&& u) noexcept(/*see below*/);                 // (1) C++11
    
    template<class U>
    constexpr reference_wrapper(U&& u) noexcept(/*see below*/);       // (1) C++20
    
    reference_wrapper(const reference_wrapper& x) noexcept;           // (2) C++11
    
    constexpr reference_wrapper(const reference_wrapper& x) noexcept; // (2) C++20
    

    概要

    与えられた参照で、参照オブジェクトを構築する。

    • (1) : T& r = forward<U>(u)のように作成したrへの参照を保持するreference_wrapperオブジェクトを構築する
      uが右辺値参照、もしくは参照とCV修飾を除去したUreference_wrapper<T>である(is_same_v<remove_cvref_t<U>, reference_wrapper<T>> == trueとなる)場合、このコンストラクタはオーバーロード解決に参加しない

    • (2) : x.get()への参照を保持するreference_wrapperオブジェクトを構築する

    例外

    • (1) : 投げない(右辺値参照を受け取らない限りnoexcept指定される)
    • (2) : 投げない

    備考

    右辺値参照を保持してしまうことを防止するためにreference_wrapper(T&&) = delete;のようなコンストラクタを用意しないのは、このdelete指定コンストラクタの存在によってT&&からreference_wrapper<T>への暗黙変換が引き起こされることを防止するためである(なお、そのような変換が起こったとしてもdelete指定コンストラクタが選ばれるため右辺値参照を保持することは無い)。
    ただし、これはC++17規格完成後の欠陥報告(LWG Issue 2993)による修正のため、実装によってはdelete指定したコンストラクタを用意している可能性がある。

    #include <iostream>
    #include <functional>
    
    int main()
    {
      int x = 3;
    
      // (1)
      // xへの参照を保持する
      std::reference_wrapper<int> r(x);
      r.get() += 1;
      std::cout << x << std::endl;
    
      // (2)
      // 参照ラッパーrが指すxへの参照を保持する
      std::reference_wrapper<int> r2(r);
      r2.get() += 1;
      std::cout << x << std::endl;
    }
    

    出力

    4
    5
    

    バージョン

    言語

    • C++11

    処理系

    参照