在 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) 当我创建项目时,我忘记检查[索引整个GOPATH]。所以目前该项目找不到第三方模块。
尽管我[index entire GOPATH]在 中检查了该项目的选项Preferences | Go | GOPATH | Project GOPATH,但该项目并未索引整个 GOPATH。
编辑:
我删除了 .idea 目录并再次打开该项目,现在工作正常。
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表示仅在该类内部可见(包括其所有成员);
我正在阅读一本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。我不明白为什么乘积和它的基数与正常形式有关。
我正在阅读Randal E. Bryant 和 David R. O'Hallaron 撰写的《计算机系统:程序员的视角》第三版。
在第3章和第7.5节中,有图演示了堆栈帧是如何分配的,如下所示:
我不明白为什么需要第 4 行和第 12 行。似乎不需要这些行,因为堆栈内存的剩余 8 个字节根本没有被使用。
正如评论所示,恕我直言,它似乎不可避免地被分配为按 24 字节对齐堆栈帧:
pushq %rbp和附加 16 个字节pushq %rbxsubq $8, %rsp所以,我的问题可以概括为“为什么堆栈帧按 24 字节对齐? ”