65,187
社区成员




map<int, int> m;
m.insert({ {1,2},{3,4},{5,6},{7,8} });
pair<const int, int> p1(1, 2);
pair<const int, int> p2(3, 4);
pair<const int, int> p3(5, 6);
pair<const int, int> p4(7, 8);
initializer_list<pair<const int, int>> il(&p1, &p4);
map<int, int> m;
m.insert(il);
// (6) initializer list
void insert(
initializer_list<value_type> IList
);
但是,这样的语法不是{}能匹配到initializer_list的条件。我将<map>头文件的内容复制过来,将所有涉及类名initializer_list的都替换成my_init_list,结果表明{}并不能匹配到my_init_list
#define _CONST_DATA constexpr
#define _CONST_FUN constexpr
#define _NOEXCEPT noexcept
template<class _Elem>
class my_init_list // 将类名改为my_init_list
{ // list of pointers to elements
public:
typedef _Elem value_type;
typedef const _Elem& reference;
typedef const _Elem& const_reference;
typedef size_t size_type;
typedef const _Elem* iterator;
typedef const _Elem* const_iterator;
_CONST_FUN my_init_list() _NOEXCEPT // 将类名改为my_init_list
: _First(0), _Last(0)
{ // empty list
}
_CONST_FUN my_init_list(const _Elem *_First_arg, // 将类名改为my_init_list
const _Elem *_Last_arg) _NOEXCEPT
: _First(_First_arg), _Last(_Last_arg)
{ // construct with pointers
}
_CONST_FUN const _Elem *begin() const _NOEXCEPT
{ // get beginning of list
return (_First);
}
_CONST_FUN const _Elem *end() const _NOEXCEPT
{ // get end of list
return (_Last);
}
_CONST_FUN size_t size() const _NOEXCEPT
{ // get length of list
return ((size_t)(_Last - _First));
}
private:
const _Elem *_First;
const _Elem *_Last;
};
// TEMPLATE FUNCTION begin
template<class _Elem> inline // 将参数类型改为my_init_list
_CONST_FUN const _Elem *begin(my_init_list<_Elem> _Ilist) _NOEXCEPT
{ // get beginning of sequence
return (_Ilist.begin());
}
// TEMPLATE FUNCTION end
template<class _Elem> inline // 将参数类型改为my_init_list
_CONST_FUN const _Elem *end(my_init_list<_Elem> _Ilist) _NOEXCEPT
{ // get end of sequence
return (_Ilist.end());
}
也就是说代码是一样的,只有类名不同,{}也不能匹配到除initializer_list之外的类[/quote]
编译器特殊处理是因为标准要求的,标准不管,谁给你特殊处理啊,别搞反了。
{...} 的语法叫 list initialization,标准要求先匹配 std::initializer_list 的重载,如果有的话。
你自己的私货进不了标准,当然编译器不屌了。
ps. 你学 c++ 的思路搞反了,正确的途径是学习标准,研究具体实现只能起辅助作用。本末倒置可能会学歪了,到时候功夫没少出,水平却不行。