Lig*_*ica 261

首先,我们将采用沼泽标准的抽象UDT(用户定义类型):

struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
Run Code Online (Sandbox Code Playgroud)

让我们回想一下,我们可以在定义UDT的同时实例化UDT:

struct foo { foo() { cout << "!"; } };          // just a definition

struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Run Code Online (Sandbox Code Playgroud)

让我们结合这些例子,回想一下我们可以定义一个没有名字的UDT :

struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Run Code Online (Sandbox Code Playgroud)

我们不再需要有关匿名UDT的证明,因此我们可能会丢失纯虚函数.也改名instancefoo,我们留下:

struct {} foo;
Run Code Online (Sandbox Code Playgroud)

越来越接近.


现在,如果这个匿名UDT来自某个基础呢?

struct bar {};       // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Run Code Online (Sandbox Code Playgroud)

最后,C++ 11引入了扩展的初始化程序,这样我们可以做到这样的混乱:

int x{0};
Run Code Online (Sandbox Code Playgroud)

还有这个:

int x{};
Run Code Online (Sandbox Code Playgroud)

最后,这个:

struct : bar {} foo {};
Run Code Online (Sandbox Code Playgroud)

这是一个从bar派生的未命名结构,实例化为foo,带有空白初始值设定项.

  • "滥用解析器:C++版".很好的答案. (96认同)
  • @Giorgio:说实话,任何这样的努力都必须从头开始重建C++,即_创建一种新语言_.那个**已经完成了很多次. (30认同)
  • @Giorgio:为什么这是一个问题?究竟是什么吓到你了?所描述的结构是语言所允许的边缘情况,并且自然地遵循其核心概念,它没有任何问题.它的实用性也非常有限.你将永远不必使用它.但是,它在语法上是合乎逻辑的,不会与任何东西发生碰撞或冲突.那么,为什么这会成为*一种语言的论据*,特别是设计得非常好的语言? (26认同)
  • @Kerrek SB我认为C++(现在是C++ 0x)有太多不同的概念,学习语法和语义很困难.每个程序员(我都是其中之一)最终会使用该语言的一个子集,因为有太多不同的方法来做同样的事情.我不认为C++设计得很好.有许多特殊功能,并且缺少某些基本功能,例如强大的模块(导入/导出)机制(仍使用C中的旧#include).我认为C++ 0x的努力应该致力于使C++更小,更容易使用,而不是更大. (17认同)
  • @Giorgio - 美妙的部分是情况正好相反; c ++ 0x正在添加许多如此多的等待强大的设施,而不是神秘或太丑陋; 你想要神秘吗? - 查看Perl.这个例子在这里几乎没有接近神秘的标题. (13认同)
  • 我知道应该避免对编程语言的负面评论,也许这里有点偏离主题.但我不明白为什么C++ 0x正在变成一种比C++更复杂的语言.谁想要那个?编程语言变得越来越神秘的优点是什么?这个声明是恕我直言,这是另一个例子.我已经使用C++很多年了,我仍然很难掌握这门语言. (10认同)
  • @Giorgio,In silico:我同意Giorgio的许多观点.以"大项目"的反对,例如:为了有效地使用语言,你应该能够运用其所有功能.所以你有两个选择:聘请专家约.相同的技能(昂贵),或者你限制自己"简单"的功能,并坚持你已经拥有的团队(无效).嗯,第三个选项是通常采取的:不要使用C++ ... (9认同)
  • @Giorgio:如果你不需要使用所有的功能......那就不要全部使用它们了.这是我听到的<程序X>或<编程语言Y>的批评.您可能只使用一部分功能,但*[功能的子集对每个人都不一样](http://www.joelonsoftware.com/articles/fog0000000020.html)*.对于每个赞美不臃肿事物的人来说,会有其他人因为没有完成工作所需的功能而抨击它. (8认同)
  • @Giorgio:我实际上发现C++语义非常简单.我同意语法有点笨拙,但这是因为C兼容性是一个设计目标,因此必须保留很多语法.我不同意你声称C++有很多特殊功能.C++委员会通常只添加高度通用的功能并解决许多问题,而不是仅解决特定问题的功能,因此它们往往会被彻底讨论和抽出. (7认同)
  • FWIW,@ Giorgio,你永远不会在现实生活中写下这段代码. (5认同)
  • @stijn:[虽然它仍然可能是一个聪明的决定;)] (4认同)
  • @Tomalak Geret'kal:也许你是对的,Java也许就是这样一个例子.无论如何,在C++项目上工作了三年之后,我仍然碰巧找到了同事们使用我以前没有遇到的构造编写的代码(我在九十年代初开始使用C++,所以我不是新手).我认为编程语言不应该有太多内置习语.所以我想知道为什么要一直添加新功能(比如这些新的初始化程序).即使新功能可能很有趣,我发现这种持续扩展相当混乱. (4认同)
  • @Philluminati:那不是C++.而且,是的,我们知道[最令人烦恼的解析](http://en.wikipedia.org/wiki/Most_vexing_parse),几乎每天都在问SO.:)(虽然这是一个声明,而不是一个调用.) (3认同)
  • @In silico:是的,但最终应该停止添加新功能,否则程序员将开始只使用该语言的一个子集.对于大型项目,不同的开发人员使用不同的语言子集/方言是不好的:它使代码审查和错误修复效率降低.我认为其他编程语言也会遇到这个问题.例如,我的一位同事抱怨Haskell功能太多,因此很难让程序员掌握. (2认同)
  • @In silico:是的,讨论可能变得非常普遍(这就是为什么我提到Haskell明确表示这不仅仅是一个C++问题).这个子集对每个人都不一样的事实正是问题所在:我在一个有20多个开发人员的项目中工作,我必须审查或修复其他人编写的代码.所以我必须学习20种不同的C++方言!它使整个开发效率降低,更容易出错. (2认同)
  • +10000000000,这是你的真实照片 (2认同)

Fru*_*nsi 104

这定义:

  • 一个匿名结构,
  • 这是公开的 bar
  • which(anonymously)除了定义它之外什么都没有定义bar
  • 最后,创建了一个名为"foo"的实例,
  • 使用空的初始化列表

struct : bar {} foo {};
Run Code Online (Sandbox Code Playgroud)