【发布时间】:2010-12-23 20:52:56
【问题描述】:
我对 C++0x 的一些新特性有点好奇。特别是range-based for loops 和initializer lists。这两个功能都需要用户定义的类才能正常运行。
我遇到了this post,虽然最佳答案很有帮助。我不知道这是否完全正确(我可能只是完全误解了,请参阅第一个答案的第三条评论)。根据初始化列表的current specifications,标头定义了一种类型:
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>,所以这是代理用户定义的代码要求)。
我完全误解了这里的工作原理吗?我认为这些新功能实际上非常依赖用户代码并没有错。感觉好像功能是半生不熟的,而不是将整个功能构建到编译器中,而是由编译器完成一半,在包含中完成一半。这是什么原因?
编辑:我输入了“严重依赖编译器代码”,而不是“严重依赖用户代码”。我认为这完全摆脱了我的问题。我的困惑不在于编译器中内置了新功能,而是编译器中内置的东西依赖于用户代码。
【问题讨论】:
标签: c++ c++11 compiler-construction initializer-list