为什么C ++不能在其概念实现中采用D的方法?


19

众所周知,概念,C ++约束模板参数可能类型的方法未能包含在C ++ 11中。

我了解到D编程语言2.0的通用编程具有类似的功能。在我看来,其解决方案非常优雅和简单。

所以我的问题是,为什么C ++无法使用类似的方法

  • C ++概念的目标可能大于D的实现所提供的目标?
  • 还是C ++的传统使它无法采用这种方法?
  • 还是其他?

感谢您的回答。

ps要查看D的通用编程能力的一些示例,请参阅:https : //stackoverflow.com/questions/7300298/metaprogramming-in-c-and-in-d/7303534#7303534


2
这个问题应该已经迁移到programmers.se。(我投了赞成票,但3票赞成“不具有建设性”)。
iammilind 2011年

3
我认为这个问题可能不是以最有建设性的方式写的,但它具有价值。我希望有人能解释D如何管理概念,并能够将其与C ++委员会在决定完全推迟该功能之前采用的两种主要方法进行比较...如果要结束,则应该最起码可以移动到程序员
大卫·罗德里格斯- dribeas

2
@David:我投票赞成重新开放(然后也许可以将其移至程序员站点)
Nawaz

1
同意大卫。我认为没有理由在任何人甚至尝试构建某些东西之前先说“非建设性”。如果答案为0,则“建设性”为0/0,因此不确定。
Emilio Garavaglia 2011年

1
@ jj1:您能为不了解该语言的我们这些人提供有关D的方法的简短解释吗?
DavidRodríguez-dribeas 2011年

Answers:


9

C ++标准是一个规范性文档,它设置了将来的文档中仍将保留(大部分不受影响)的规则。因此,委员会在更新方面采取了非常谨慎的态度。

标准库的添加有些容易。许多库在Boost中使用了很长时间:已经证明它们可以工作。

但是,要尝试使用该语言中的核心概念要困难得多,因为它首先需要修改编译器。在没有编译器支持的情况下,指定了C ++ 03功能(模板的导出)……结果很糟糕。EDG编译器前端的实现者将其报告为一项艰巨的任务(数个工年),却收获很少。没有其他编译器尝试实现它。这不是一个舒适的情况。

constexprstatic_assert一样简单的功能(已经被库模拟)。Lambda很容易理解,并可以用多种其他语言实现,已经进行了广泛的研究,因此主要是语法问题。

另一方面,概念被认为太新了,还没有尝试过。他们几乎没有及时指定,没有概念证明……因此他们被拒绝了,而不是等待他们(或犯错)。

为什么不跟随D?没有说不会的。该委员会鼓励人们重新思考,没有紧迫的最后期限,并尝试将他们包括在编译器中,以查看他们如何与该语言的其他功能交互。尤其存在分离概念图和概念图的问题:是否应将它们捆绑为一个?

仅供参考:印第安纳大学的Larisse Voufo领导的Clang分公司目前正致力于这项实验。


小注释:export关键字实际上是c ++ 98功能(原始标准化)。2003年的更正主要针对图书馆的功能。
ex0du5 2011年

@ ex0du5:是的,'03是C ++ 98标准的次要版本,主要涉及更正。
Matthieu M.

3

对于2011年标准,正在使用C ++概念,但由于它们“不够成熟”,因此最终从该标准中删除。有关C ++概念的工作仍在继续,这可能会使他们成为下一个标准。但是,有些人可能会为下一个标准制定提案,该提案类似于D的模板约束。这是否发生还有待观察。据我所知,目前尚无针对2011年标准的提议,因此无论其优缺点,都没有机会使其成为该标准,但是什么或将使其不成为下一个标准是完全未知的在此刻。

我不知道为什么不能为C ++实现类似于D的模板约束的任何主要原因,尽管考虑到C ++通常在编译时只能做些限制,所以使它们像就像他们在D中所做的一样(尽管引入某些东西constexpr肯定会有所帮助)。

所以,实际上,我认为简短的答案是,没有技术上的原因导致C语言中无法使用类似于D的模板约束的东西。

问题是,是否将为下一个标准提出这样的建议,以及如何与提出的任何类似建议(例如,与概念有关的建议)进行比较。假设可以提出一个可以接受的建议,我完全希望与概念或D的模板约束类似的东西将成为下一个标准,仅仅是因为对此有很多需求。问题是,是否有人可以提出一个足够扎实,足够“成熟”的建议。


2

您是说D的模板受约束?

据我所知,C ++概念是代表boost :: concept提出的。这里的问题是boost是为C ++ 03编写的库。C ++ 11具有其他语法功能,可以用C ++ 03允许的其他方式来实现某些事情(因此,可以利用新语法来重写boost本身)。

标准委员会放弃了概念,因为指定它们的时间太长了(因此又延迟了c ++ 11的批准)。他们可能会在下一个C ++版本中使用。

同时,D语法与C ++不同,并且D本身在编译时仍保留了某些表达式评估功能,而C ++在不破坏某些旧代码的情况下始终无法拥有(D所没有的,具有较短的历史)。C ++本身现在具有static_assertcostexpr,从而可以改善编译时评估功能。也许将来会达到类似的水平。


2

这是赫伯·萨特(Herb Sutter)的质量检查,他在15分钟的时间谈论概念。

http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers

如果您喜欢,这里还有另一个:http : //channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11

现在关于您的问题。为什么不是D版本?那么为什么要使用它呢?C ++是一种非常复杂且稳定的语言。每个功能的选择都需要非常仔细地进行,因为它通常需要几十年的支持。如果您查看第一个C ++标准并遵循这些修订,则其中有些功能已弃用,但仍必须支持这些功能。因此,将概念设计为100%适合C ++是有意义的。

至于为什么它不包含在C ++ 0x中。好吧,因为它很大。该提案长达100页,很难实施。决定该功能需要更多时间才能成熟,直到将其包含在标准中。


2

简而言之,C ++比D具有更多的历史包.。如果不是因为C ++有大量的历史代码必须继续正常工作,那么实现很多事情就容易得多。和预期的一样。D没有这个问题。


也许您只是说错了,但问题不在于遗留代码,问题在于数十年来,该语言中都存在任何新功能,并且必须予以支持。这意味着必须非常仔细地选择每个新功能。
Let_Me_Be 2011年

@Let_Me_Be:是的,问题出在遗留代码中,如果我们现在提出概念,我们将落后十年。
David Thornley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.