如何从构造函数初始化列表中的常量构造函数访问属性?

How to access the attribute from a constant constructor in the constructor initialiser list?

我无法理解 Dart 中的常量构造函数和构造函数初始值设定项列表。

我有这个小代码:

class A {
  const A();
}

class B {
  const B();

  final A a = const A();
}

class C {
  const C(): a = const A();

  final A a;
}

class D {
  const D(): b = const B();

  final B b;
}

class E {
  const E(): a = const B().a;  // <- Lint: Invalid constant value

  final A a;
}

所有这些 类 及其构造函数都是合法的。 EE() 构造函数除外。


我不明白的是 D 构造函数是有效的:

const C(): a = const A();

但是E无效:

const E(): a = const B().a;  // <- Lint: Invalid constant value

有点疑惑,为什么B()可以是常量而B().a不是?我会想如果一个对象是一个常量构造函数,B().a 也会是一个常量值。

我在这里错过了什么?

It kind of confuses me, why does B() can be a constant value not B().a is not? I would have thought if an object is a constant constructor, B().a would have been a constant value too.

Dart 没有 C++ 中的 constexpr 等价物。 Dart 无法传达 methods/functions 可以作为编译时常量表达式进行计算和调用。

B().aB() 上调用名为 a 的 getter。仅仅因为 const B() 是一个 const 对象并不意味着 const B().a returns 是一个常量值。例如,B 的实现可能是:

class B {
  const B();

  // Returns a new `A` instance each time.
  A get a => A();
}