在 Java 中我们可以声明一个 blank final
变量并稍后对其进行初始化。编译器将确保初始化发生恰好一次——初始化失败或双重初始化都是编译时错误。例如:
public int bar() {
return 66;
}
public void foo() {
final int x; // declare the variable
...
x = bar(); // initialization only once
}
在 Java 中,编译器可以保证 x
在第一次赋值之前绝对不会在任何代码路径上赋值,并且可以保证它绝对不会在任何代码路径上被第二次赋值。 (有关详细信息,请参阅 Chapter 16, Definite Assignment, of the Java Language Specification。)
我们如何在 C++ 中实现类似的行为?是否可以将变量声明为 const
但推迟其初始化? (不丢弃 const
说明符。)
最佳答案
除非定义了常量,否则不可能初始化常量。您必须找到一种方法来了解其定义的值(value)。如果 x
的值难以确定,请考虑使用像
const int x = calc_x();
或者像
这样的闭包const int x = []() { /* code to calculate x's value */ }();
const
ness 是对象类型的一部分,对象类型在任何情况下都不能更改,因此 x
是 const
并且您以后无法对其进行初始化,或者 x
根本不是 const
。
可以设计一个包装器 class
来模拟它,但最多只会出现运行时错误。
请注意,似乎有 const_cast
形式的解决方案,但假设所讨论的对象实际上不是 const
。在 const int x
的情况下,无法在初始化后合法地更改它的值。
关于java - 是否可以延迟 C++ 中 const 变量的初始化,例如 Java 的 "blank final"功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458553/