- functional[meta header]
- std[meta namespace]
- reference_wrapper[meta class]
- function[meta id-type]
- cpp11[meta cpp]
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修飾を除去したU
がreference_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;
}
- r.get()[link get.md]
4
5
- C++11
- Clang: ??
- GCC:
- GCC, C++11 mode: 4.7.0
- ICC: ??
- Visual C++: ??