【问题标题】:What is this crazy C++11 syntax ==> struct : bar {} foo {};?这个疯狂的c ++ 11语法==> struct:bar {} foo {} ;?
【发布时间】:2011-10-27 10:09:12
【问题描述】:

这在 C++11 中可能意味着什么?

struct : bar {} foo {};

【问题讨论】:

  • 有趣,你觉得它有什么用吗?我想这是生成强类型(标记类型)单个实例的技巧。
  • @alfC:不是特别有用,没有

标签: c++ c++11


【解决方案1】:

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

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

我们还记得,我们可以在定义 UDT 的同时实例化它:

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

struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"

让我们结合示例,回想一下我们可以定义一个 没有名称的 UDT:

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

我们不再需要关于匿名 UDT 的证明,所以我们可以失去纯虚函数。同样将instance 重命名为foo,我们还剩下:

struct {} foo;

越来越近了。


现在,如果这个匿名 UDT 是从某个基础派生出来的呢?

struct bar {};       // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof

最后,C++11 引入了扩展的初始化器,这样我们就可以做这样令人困惑的事情:

int x{0};

还有这个:

int x{};

最后,这个:

struct : bar {} foo {};

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

【讨论】:

  • 我知道应该避免对编程语言的负面评价,也许这里有点离题了。但我不明白为什么 C++0x 正在成为一种比 C++ 更复杂的语言。谁想要那个?越来越神秘的编程语言有什么优势?这个声明是恕我直言的又一个例子。我已经使用 C++ 很多年了,但我仍然很难掌握这门语言。
  • @Giorgio:为什么会出现这个问题?究竟是什么让你害怕?所描述的结构是语言允许的边缘情况,并且自然地遵循其核心概念,没有任何问题。它的效用也非常有限。您将永远不必使用它。但是,它在语法上是合乎逻辑的,不会与任何东西发生冲突或冲突。那么,为什么这是一个反对一种语言的论点,尤其是一种设计得非常好的语言?
  • @Giorgio -- 美妙的是,情况恰恰相反; c++0x 添加了许多期待已久的强大功能,但又不神秘也不丑陋;你想神秘吗? ——看看 Perl。这个例子在这里几乎没有接近神秘的标题。
  • @Kerrek SB 我认为 C++(现在是 C++0x)有太多不同的概念,学习语法和语义很困难。每个程序员(我就是其中之一)最终都会使用该语言的一个子集,因为有太多不同的方式来做同样的事情。我不认为 C++ 是精心设计的。有许多临时功能,并且缺少某些基本功能,例如健壮的模块(导入/导出)机制(仍然使用 C 中的旧 #include)。我认为 C++0x 的努力应该旨在使 C++ 更小、更易于使用,而不是更大。
  • @Giorgio:老实说,任何此类努力都必须从头开始重建 C++,即创建一种新语言。而这已经完成了......很多次。
【解决方案2】:

这定义了:

  • 一个匿名结构,
  • bar公开派生
  • 其中 (anonymously) 只定义了从 bar 派生的内容
  • 最后,创建了一个名为“foo”的实例,
  • 带有一个空的初始化列表

struct : bar {} foo {};

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多