Bootstrap

std::pair源码:operator=被delete了,提供的是sfinae版本

D:\DevTools\VS2017\VC\Tools\MSVC\14.16.27023\include\utility

pair& operator=(const volatile pair&) = delete;


真正版本:

	template<class _Other1 = _Ty1,
		class _Other2 = _Ty2,
		enable_if_t<conjunction_v<
			is_assignable<_Ty1&, const _Other1&>,
			is_assignable<_Ty2&, const _Other2&>
		>, int> = 0>
		pair& operator=(const pair<_Other1, _Other2>& _Right)
			_NOEXCEPT_COND(is_nothrow_assignable_v<_Ty1&, const _Other1&>
				&& is_nothrow_assignable_v<_Ty2&, const _Other2&>)	// strengthened
		{
		first = _Right.first;
		second = _Right.second;
		return (*this);
		}

	template<class _Other1 = _Ty1,
		class _Other2 = _Ty2,
		enable_if_t<conjunction_v<
			is_assignable<_Ty1&, _Other1>,
			is_assignable<_Ty2&, _Other2>
		>, int> = 0>
		pair& operator=(pair<_Other1, _Other2>&& _Right)
			_NOEXCEPT_COND(is_nothrow_assignable_v<_Ty1&, _Other1>
				&& is_nothrow_assignable_v<_Ty2&, _Other2>)	// strengthened
		{
		first = _STD forward<_Other1>(_Right.first);
		second = _STD forward<_Other2>(_Right.second);
		return (*this);
		}

怎么发现的呢,看下面代码:

编译的时候,提示operator=已被删除
下面的代码编译不过,也是符合逻辑的,毕竟,相当于把map中的key值也给改了。

std::map<std::string, std::string> data;// = getData();
//
 make all values uppercase
std::transform(data.begin(), data.end(), data.begin(),
  [](std::map<std::string, std::string>::value_type& p) 
{
      //boost::to_upper(p.second);
      return(p);
});


error C2679: 二进制“=”: 没有找到接受“std::pair<const _Kty,_Ty>”类型的右操作数的运算符(或没有可接受的转换)
1>        with
1>        [
1>            _Kty=std::string,
1>            _Ty=std::string
1>        ]

下面的代码就可以编译通过:
std::pair<std::string, std::string> data0 = std::make_pair("1", "2");
std::pair<std::string, std::string> data1 = std::make_pair("3", "4");
data0 = data1;

下面的代码可以复现这个编译错误:
std::pair<const int, int> c[2];
c[0] = std::make_pair(1, 1);
return 0;
想修改mpa里的second值的话,可以用std::for_each
std::map<std::string, std::string> data0;// = std::make_pair("1", "2");
        data0["1"] = "2";
        std::for_each(data0.begin(), data0.end(),
            [](std::pair<const std::string, std::string>& p) {
            p.second = "foobar";
        });

;