我对 C++0x 的一些新特性有点好奇。特别是基于范围的 for 循环和初始化列表。这两个功能都需要用户定义的类才能正常运行。
我遇到了这篇文章,虽然最佳答案很有帮助。我不知道这是否完全正确(我可能只是完全误解了,请参阅第一个答案的第三条评论)。根据初始化列表的当前规范,标头定义了一种类型:
template<class E> class initializer_list {
public:
initializer_list();
size_t size() const; // number of elements
const E* begin() const; // first element
const E* end() const; // one past the last element
};
您可以在规范中看到这一点,只需 Ctrl + F 'class initializer_list'。
为了= {1,2,3}
隐式转换到类中,编译器必须对和initializer_list
之间的关系有所了解。没有构造函数可以接收任何内容,因此据我所知, initializer_list 是一个包装器,它绑定到编译器实际生成的任何内容。{}
initializer_list
循环也一样for( : )
,它也需要用户定义的类型才能工作(尽管根据规范,更新为不需要数组和初始化列表的任何代码。但初始化列表需要<initializer_list>
,所以这是用户定义的代码要求代理)。
我完全误解了这是如何在这里工作的吗?我认为这些新功能实际上非常依赖用户代码并没有错。感觉好像这些功能是半生不熟的,而不是将整个功能构建到编译器中,而是由编译器完成一半,在包含中完成一半。这是什么原因?
编辑:我输入了“严重依赖编译器代码”,而不是“严重依赖用户代码”。我认为这完全摆脱了我的问题。我的困惑不在于编译器中内置的新功能,而是编译器中内置的依赖用户代码的东西。