在2009年7月C++0x meeting in Frankfurt,决定从C ++ 0x remove concepts。就个人而言,我很失望,但我宁愿有一个可实现的C ++ 0x而不是没有C ++ 0x。他们说他们将在以后加入。
您对此决定/问题有何看法?它会对你有什么影响?
答案 0 :(得分:8)
就个人而言,我对删除并不太不满意,因为概念的目的主要是改善编译时错误信息,正如概念提案的共同作者之一Jeremy Siek写的那样(http://lambda-the-ultimate.org/node/3518#comment-50071) :
虽然概念提案不是 完美(可以扩展到C ++ 真的很完美吗?),它会 提供了一个非常实用的 有用的语言扩展, 大幅扩展 减少臭名昭着的错误消息 当前模板的用户 图书馆受到了困扰。
当然,概念的目的不仅仅是让编译器能够提供更短的错误消息,但目前我认为我们都可以在没有它们的情况下生存。
编辑:Herb Sutter也写了他的blog:
问:这个C ++ 0x不是一个大问题 功能?答:不会。概念很棒,但是 对于大多数用户,存在或 没有概念就没有 与他们的经历有所不同 除了错误质量外,C ++ 0x 消息。
问:不是关于添加专业的概念 语言的新表现力, 所以启用主要的新类型 程序或编程风格?
答:不是。概念差不多 完全是为了获得更好的错误 消息。
答案 1 :(得分:6)
我很期待他们。主要是为了在编译失败时更好地报告错误。没有什么比阅读1000个字符串来找出你的愚蠢错误了。
答案 2 :(得分:4)
我感到非常难过,看到他们跌出榜单。
我个人喜欢用来遵守已知界面的类型,无论是原语,结构还是类。这样我就知道如何使用类型以及我必须实现的类型来提供类型。
使用标准的面向对象编程很容易实现。但是在我看来,虽然技术上通用的编程是强类型的,但是它失去了键入提供OO的接口概念。事实上,泛型编程有点像动态类型,但从接口角度解析为编译类型。
例如,我将迭代器传递给算法,它必须提供一些运算符,但是没有接口来指定这些运算符应该做什么,或者它们的契约是什么(仅文档)。如果您有operator++()
和operator*()
,它将进行编译,但它不会为您提供接口在OO中提供的相同类型保证。
对我而言,概念为通用编程带来了类型,并且确定性接口为OO带来了更好的编译只是一个奖励。
我知道我们都是c ++程序员,我们非常聪明,我们阅读文档并理解运算符重载和泛型编程的细微之处。但是当语言提供保证我可以依赖并且编译器可以测试时,我可以花更多的脑力来解决我付出的问题来解决。
答案 3 :(得分:2)
我还没有深入参与概念。但是,我注意到的是,它们通常都很冗长。我想我不希望他们在STL库中。我已经知道了库,我可以轻松地解析任何编译时错误。不需要概念。但是,描述我自己的类的概念会很好,这样同事就能更快地学习它们并避免误用。到目前为止,每个概念都是一种约束,它限制了类型的使用。在创建其他人必须学习的新界面时,这将是很好的。
答案 4 :(得分:1)
我非常喜欢概念!通过外部定义(概念映射)使非常不同类型的行为相同的可能性是一个非常强大且有用的特性(特别是它在编译时发生,因此不会影响运行时性能)。
我认为它比直接在类型中实现所有有用的功能并通过.NET中完成的接口访问它们更强大和更好。这不允许以后的可扩展性(好吧,.NET知道自3.0以来的扩展方法(或3.5,不确定),但它不一样)。
改进错误信息是概念带来的另一个(也是最初的)改进。
但是在阅读概念时我的第一个想法是:这将花费LOOOOONG时间直到GCC和MSVC支持它。
所以我认为从即将推出的标准中删除它是有意义的。但我希望的是一个固定的C ++ 0x标准功能协议,其中包含概念。 这将使编译器供应商能够更好地为C ++ 2x标准做好准备。
所以我真的希望我们能在不远的将来看到概念。
答案 5 :(得分:1)
我认为他们做出了正确的决定。我希望看到语言中添加了高质量的概念实现,但是规范朝着错误的方向发展,给用户带来了太多的负担,无法明确指定概念图。 Stroustrup的论文确实对此提出了一些修正,但我认为这将是一个相当激进的变化,因此在这个过程的后期。并且没有编译器来测试它。
总而言之,最终指定的概念将向后退一大步,阻碍通用编程,并可能破坏C ++社区,一大群程序员坚持使用C ++ 03。
Stroustrup提出的“修复”的概念,据我所知,一直没问题,但如此快速地采用这些变化将是危险的。 (而且我不相信它不会造成进一步的延误。)
老实说,我很高兴看到他们现在安全地将它们移除了。到目前为止,我们没有任何概念而幸存下来,而且我可以在没有它们的情况下再活5年。
答案 6 :(得分:1)
非常难过。将概念引入C ++会使其类型系统几乎达到与Haskell类型类相同的功能水平,并且它会非常棒 - 一种针对速度优化的语言,让您做任何您想做的事情,但除非您使用逃逸通风口,否则严格类型安全(虽然仍然保持快速!)。它也应该解决由于C ++ 03模板的“编译时鸭子打字”性质松懈以及编译器随之而来的麻烦而导致STL和Boost(以及一般的模板库)难以使用的长期问题。错误报告。
答案 7 :(得分:1)
我也认为这是一个糟糕的电话,C++0x
对于删除来说会更糟,但刚刚读完Stroustrup的Simplifying the use of Concepts我已经改变了主意。我不知道概念提案是那么复杂,我认为在添加到语言之前对它进行深思熟虑是件好事。尽管Stroustrup正在传播保持概念,他的文章使我确信,现在看来概念会弊大于利,尽管BS提出了一个解决方案,我担心它可能会匆忙而不是所有的含义都被理解。
答案 8 :(得分:1)
我很伤心。
我结帐了ConceptGCC,这很棒!我已经使用这个编写了一些简单的库,我看到了一些缺点,比如要编写更多的代码,或者在思考Concept的抽象功能时会有些麻烦。 std概念库确实存在问题,因此在标准中包含这样的问题只是误解。我认为即将到来的标准应该只标准化概念语法,并提供一些如何使用它的提示。