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