小编jin*_*ong的帖子

在 C++ 中声明一个 const 对象需要一个用户定义的默认构造函数。如果我有一个可变成员变量,为什么不呢?

在 C++ 中,要声明具有成员变量 as 的类的对象const,我们必须有一个用户定义的默认构造函数。下面的代码说明了这一点。

class Some {
    int value;
};

int main() {
    // error: default initialization of an object of const type 'const Some'
    //        without a user-provided default constructor
    const Some some;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果类拥有的成员变量被限定为可变的,编译器将不会报告任何错误。作为参考,我使用命令编译clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug。我想知道这个结果是由于编译器中的错误还是根据C++语言中定义的语法。

class Some {
    mutable int value;
};

int main() {
    const Some some;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ clang++

8
推荐指数
1
解决办法
640
查看次数

如何为 Goland 中的现有项目索引整个 GOPATH?

当我创建项目时,我忘记检查[索引整个GOPATH]。所以目前该项目找不到第三方模块。

尽管我[index entire GOPATH]在 中检查了该项目的选项Preferences | Go | GOPATH | Project GOPATH,但该项目并未索引整个 GOPATH。


编辑:

我删除了 .idea 目录并再次打开该项目,现在工作正常。

go goland

5
推荐指数
0
解决办法
3764
查看次数

为什么可以在子类中调用密封类的私有构造函数?

Kotlin 中的密封类只能有private构造函数。这意味着我们只能调用构造函数本身:

密封类不允许有非私有构造函数(它们的构造函数默认是私有的)。

// `private` and `constructor()` are redundant.
sealed class Expr private constructor()
Run Code Online (Sandbox Code Playgroud)

但是,当我们使用密封类时,子类必须继承密封类:

// Above Kotlin 1.1
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
Run Code Online (Sandbox Code Playgroud)

正如您在上面的代码中看到的那样,密封类的private构造函数是在密封类本身之外调用的。子类实例化时,会先调用父类(密封类)的构造函数,再调用子类自己的构造函数。它只是可见性修饰符的例外吗?

https://kotlinlang.org/docs/reference/visibility-modifiers.html#classes-and-interfaces

对于在类内部声明的成员:private表示仅在该类内部可见(包括其所有成员);

kotlin

5
推荐指数
1
解决办法
3327
查看次数

为什么乘积总和可以被视为代数数据类型中的标准形式?

我正在阅读一本Haskell 书(第 412 页)。在本书中,对积和的范式有一个解释:

所有现有的乘积和和的代数规则都适用于类型系统,其中包括分配属性。让我们来看看它在算术中是如何工作的:

2 * (3 + 4)
2 * (7)
14
Run Code Online (Sandbox Code Playgroud)

我们可以用分布在加法上的乘法重写它并获得相同的结果:

2 * 3 + 2 * 4
(6) + (8)
14
Run Code Online (Sandbox Code Playgroud)

这被称为“乘积总和”。在普通算术中,表达式在被简化为最终结果时是普通形式。但是,如果您将上述表达式中的数字视为集合基数的表示,那么乘积之和表达式就是正常形式,因为不需要执行计算。

我知道正常形式表示表达式完全减少。在上面的描述中,该书的作者解释说,当我们将表达式视为集合基数的表示时,可以将乘积之和视为正常形式。我不明白。

类型的基数意味着该类型(如集合)中可以包含多少个不同的值。例如,Bool输入 haskell 的基数为2,即加 1 forFalse和 1 for Trueeach。

乘积之和 ( 2 * 3 + 2 * 4) 是正规形式吗?该表达式可以进一步减少,因为完全减少的表达将是14。我不明白为什么乘积和它的基数与正常形式有关。

haskell functional-programming algebraic-data-types

2
推荐指数
1
解决办法
213
查看次数

为什么栈帧按24字节对齐?

我正在阅读Randal E. Bryant 和 David R. O'Hallaron 撰写的《计算机系统:程序员的视角》第三版

在第3章和第7.5节中,有图演示了堆栈帧是如何分配的,如下所示:

数字

我不明白为什么需要第 4 行和第 12 行。似乎不需要这些行,因为堆栈内存的剩余 8 个字节根本没有被使用。

正如评论所示,恕我直言,它似乎不可避免地被分配为按 24 字节对齐堆栈帧:

  • 分别为pushq %rbp和附加 16 个字节pushq %rbx
  • ,以及 8 个字节subq $8, %rsp

所以,我的问题可以概括为“为什么堆栈帧按 24 字节对齐?

assembly x86-64

1
推荐指数
2
解决办法
467
查看次数