java - 是否可以延迟 C++ 中 const 变量的初始化,例如 Java 的 "blank final"功能?

标签 java c++ c++11 constants final

在 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 */ }();

constness 是对象类型的一部分,对象类型在任何情况下都不能更改,因此 xconst并且您以后无法对其进行初始化,或者 x 根本不是 const

可以设计一个包装器 class 来模拟它,但最多只会出现运行时错误。

请注意,似乎有 const_cast 形式的解决方案,但假设所讨论的对象实际上不是 const。在 const int x 的情况下,无法在初始化后合法地更改它的值。

关于java - 是否可以延迟 C++ 中 const 变量的初始化,例如 Java 的 "blank final"功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458553/

相关文章:

java - 如何在 Spring Boot + GraphQL Java 工具上下文中执行对 GraphQL 的 Java 调用?

java - 用于非常大的 XML 文件的 SAX 解析器

java - 如何创建多个 JAR 文件的单个 exe 文件?

c++ - VS2010 附加包含目录无法工作

c++ - rapidxml:如何遍历节点?遗漏了最后一个 sibling

c++ - 使用CL_MEM_USE_HOST_PTR时是否需要入队读/写?

java - jni 从 c/c++11 返回字符串数组并在 java 上使用而不在 c++ 端使用 for 循环?

c++ - 检查 C++11 中的类型 #defines

c++11 - std::weak_ptr 什么时候有用?

用于 GUI 的 Java 2D 场景图形库