像这样写代码

struct S
{
    this() // compile-time error
    {
    }
}

给我一条错误消息说
default constructor for structs only allowed with @disable and no body.
为什么??

最佳答案

这是一种比最初预期要棘手得多的情况。

D与C++相比,重要且有用的功能之一是,每个单一类型(包括所有用户类型)都有一些初始的非垃圾值,可以在编译时对其进行评估。它用作T.init,并具有两个重要的用例:

  • 模板约束可以使用T.init值来检查是否可以对给定类型执行某些操作(引用Kenji Hara的代码段):
    template isSomething(T) {
       enum isSomething = is(typeof({
           //T t1;                      // not good if T is nested struct, or has @disable this()
           //T t2 = void; auto x = t2;  // not good if T is non-mutable type
           T t = T.init;                // avoid default construct check
           ...use t...
       }));
    }
    
  • 除非您明确使用int i = void语法,否则始终始终正确初始化变量。不可能有垃圾。

  • 鉴于此,出现了困难的问题。我们应该保证T()和T.init是相同的(就像许多C++程序员所期望的那样)还是允许默认构造轻松地破坏该保证。据我所知,尽管出人意料,但还是做出了第一种方法更安全的决定。

    但是,讨论不断涌现,并提出了各种改进建议(例如,允许启用CTFE的默认构造函数)。最近出现了一种such thread

    关于d - 为什么我不能在D中实现结构的默认构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16648273/

    10-13 03:17