pair& operator=(const pair& p); // (1) C++03
constexpr pair& operator=(const pair& p); // (1) C++20
constexpr const pair& operator=(const pair& p) const; // (2) C++23
template <class U, class V>
pair& operator=(const pair<U, V>& p); // (3) C++03
template <class U, class V>
constexpr pair& operator=(const pair<U, V>& p); // (3) C++20
template<class U, class V>
constexpr const pair& operator=(const pair<U, V>& p) const; // (4) C++23
pair& operator=(pair&& p) noexcept(see below); // (5) C++11
constexpr pair& operator=(pair&& p) noexcept(see below); // (5) C++20
constexpr const pair& operator=(pair&& p) const; // (6) C++23
template <class U, class V>
pair& operator=(pair<U, V>&& p); // (7) C++11
template <class U, class V>
constexpr pair& operator=(pair<U, V>&& p); // (7) C++20
template<class U, class V>
constexpr const pair& operator=(pair<U, V>&& p) const; // (8) C++23
template<pair-like P>
constexpr pair& operator=(P&& p); // (9) C++23
template<pair-like P>
constexpr const pair& operator=(P&& p) const; // (10) C++23
概要
- (1) : 同じ型の
pair
をコピー代入する - (2) : (1) のプロキシ参照版
- (3) : 変換可能な
pair
をコピー代入する - (4) : (3) のプロキシ参照版
- (5) : 同じ型の
pair
をムーブ代入する - (6) : (5) のプロキシ参照版
- (7) : 変換可能な
pair
をムーブ代入する - (8) : (6) のプロキシ参照版
- (9) :
pair-like
なオブジェクトを代入 - (10) : (9) のプロキシ参照版
プロキシ参照版とは、プロキシ参照である(要素がどちらもプロキシ参照である)pair
が持つ各要素について、その要素の参照先へ、他のpair
又はpair-like
なオブジェクトの対応する値を代入する動作を行う版である。
要件
- (1) :
is_copy_assignable<T1>::value && is_copy_assignable<T2>::value
であること - (2) : C++23 :
is_copy_assignable_v<const T1> && is_copy_assignable_v<const T2>
であること - (3) :
is_assignable<T1&, const U&>::value && is_assignable<T2&, const V&>::value
であること - (4) : C++23 :
is_assignable_v<const T1&, const U&> && is_assignable_v<const T2&, const V&>
であること - (5) :
is_move_assignable<T1>::value && is_move_assignable<T2>::value
であること - (6) : C++23 :
is_assignable_v<const T1&, T1> && is_assignable_v<const T2&, T2>
であること - (7) :
is_assignable<T1&, U>::value && is_assignable<T2&, V>::value
であること - (8) : C++23 :
is_assignable_v<const T1&, U> && is_assignable_v<const T2&, V>
であること - (9) : 次を全て満たすこと
- C++23 :
different-from<P, pair>
- C++23 :
remove_cvref_t<P>
がranges::subrange
の特殊化でないこと - C++23 :
is_assignable_v<T1&, decltype(get<0>(std::forward<P>(p)))>
- C++23 :
is_assignable_v<T2&, decltype(get<1>(std::forward<P>(p)))>
- C++23 :
- (10) : 次を全て満たすこと
- C++23 :
different-from<P, pair>
- C++23 :
remove_cvref_t<P>
がranges::subrange
の特殊化でないこと - C++23 :
is_assignable_v<const T1&, decltype(get<0>(std::forward<P>(p)))>
- C++23 :
is_assignable_v<const T2&, decltype(get<1>(std::forward<P>(p)))>
- C++23 :
効果
- (1), (2), (3), (4) :
p.first
をthis->first
に、p.second
をthis->second
にコピー代入する - (5), (6), (7), (8) :
p.first
をthis->first
に、p.second
をthis->second
にムーブ代入する - (9), (10) :
get<0>(p)
をp.first
に、get<1>(p)
をp.second
に代入する
戻り値
*this
例外
- (5) :
is_nothrow_move_assignable<T1>::value && is_nothrow_move_assignable<T2>::value
である場合、この関数は例外を決して投げない
例
#include <iostream>
#include <utility>
#include <string>
template <class T1, class T2>
void print(const std::string& name, const std::pair<T1, T2>& p)
{
std::cout << name << " : (" << p.first << "," << p.second << ")" << std::endl;
}
int main()
{
// コピー代入
{
std::pair<int, std::string> p(1, "abc");
std::pair<int, std::string> p1;
p1 = p;
print("p1", p1);
}
// 変換可能なpairのコピー代入
{
std::pair<int, const char*> p(1, "abc");
std::pair<int, std::string> p2;
p2 = p;
print("p2", p2);
}
// ムーブ代入
{
std::pair<int, std::string> p(1, "abc");
std::pair<int, std::string> p3;
p3 = std::move(p);
print("p3", p3);
}
// 変換可能なpairのムーブ代入
{
std::pair<int, const char*> p(1, "abc");
std::pair<int, std::string> p4;
p4 = std::move(p);
print("p4", p4);
}
}
出力
p1 : (1,abc)
p2 : (1,abc)
p3 : (1,abc)
p4 : (1,abc)
バージョン
言語
- C++11 : (5), (7)
処理系
- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅
- (1), (3)はそれより前から実装されている。