我对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 '类初始化列表'.

为了 = {1,2,3} 被隐式地投射到 initializer_list 类,编译器必须有一些关于之间关系的知识 {}initializer_list. 。没有接收任何内容的构造函数,因此据我所知,initializer_list 是一个包装器,它绑定到编译器实际生成的任何内容。

for( : ) 循环,它还需要用户定义的类型才能工作(尽管根据规范,已更新为不需要任何数组和初始值设定项列表的代码。但初始化列表需要 <initializer_list>, ,所以这是代理的用户定义代码要求)。

我是否完全误解了这里的工作原理?我认为这些新功能实际上极度依赖用户代码,这一点并没有错。感觉好像这些功能是半生不熟的,并且不是将整个功能构建到编译器中,而是一半由编译器完成,一半在包含中完成。这是什么原因呢?

编辑: 我输入了“严重依赖编译器代码”,而不是“严重依赖用户代码”。我认为这完全摆脱了我的问题。我的困惑不在于编译器中内置的新功能,而在于编译器中内置的依赖于用户代码的东西。

有帮助吗?

解决方案

  

我在想,这些新功能都依赖逸岸极为倚重的编译器代码是没有错的。

他们非常依赖于编译器。无论您是需要包括头与否,事实是,在这两种情况下,语法将与今天的编译器解析错误。所述for (:)不太适合到现今标准,其中只允许构建体是for(;;)

  

感觉仿佛特征是半生不熟,和而不是构建整个特征到编译器,它被编译器半完成和完成了一半中包括。有什么道理呢?

在支持必须在编译器中实现,但你必须包括系统的头球为它工作。这可用于几个目的,在初始化列表的情况下,它带来的类型(接口编译器支持)为范围的用户,这样你可以使用它的方法(想想va_args如何在C)。在的情况下,范围为基础的(这只是语法糖),你需要把范围分为适用范围,使编译器可以执行它的魔力。注意,标准(在草案[6.5.4] / 1)for ( for-range-declaration : expression ) statement定义为等同于:

{ 
   auto && __range = ( expression ); 
   for ( auto __begin = std::Range<_RangeT>::begin(__range), 
         __end = std::Range<_RangeT>::end(__range); 
         __begin != __end; 
         ++__begin ) { 
      for-range-declaration = *__begin; 
      statement 
   } 
} 

如果你想使用它仅能用于数组和STL容器可能没有Range概念(不是在C ++ 0x中的意义)来实现,但如果你想语法扩展到用户定义的类(你自己的容器)编译器可以很容易地取决于现有Range模板(用自己的可能的专业化)。被定义,这取决于模板的机构相当于需要在容器上的静态接口。

其它大多数语言都进去了,需要定期接口(说集装箱,...),并使用上运行时多态性的方向。如果这是在C ++来完成,整个STL将必须经过一个主要重构作为STL容器不共享一个共同的基础或接口,并且它们不准备被polimorphically使用。

如果有的话,目前的标准将不 underbaked 通过将其熄灭的时间。

其他提示

这只是语法糖。编译器会将给定的语法结构扩展为直接引用标准类型/符号名称的等效 C++ 表达式。

这并不是现代 C++ 编译器的语言与“外部世界”之间唯一的强耦合。例如, extern "C" 是一种适应 C 链接模型的语言黑客。面向语言的声明线程本地存储的方法隐式依赖于许多 RTL hackery 的工作。

或者看看C。如何访问通过传递的参数 ...?需要依赖标准库;但这使用的魔法非常依赖于 C 编译器如何准确地布置堆栈帧。

更新:

如果说有什么不同的话,那就是 C++ 在这里采用的方法比替代方案更符合 C++ 的精神——即添加一个 固有的 集合或范围类型,已融入语言中。相反,它是通过供应商定义的范围类型来完成的。我真的不认为它与可变参数有什么不同,如果没有供应商定义的访问器宏,可变参数同样毫无用处。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top