Dart 编译器能够推断 const 构造函数的用法吗?

Dan*_*ico 3 inference constants compiler-optimization dart flutter

我认为 dart 会使用const构造函数,如果它能够自动执行的话,为了解释这个假设,让我们假设我们有一个已经有const constructor类似的小部件:

class Retry extends StatelessWidget {
  const Retry();
}
Run Code Online (Sandbox Code Playgroud)

然后因为 dart“能够推断 const 用法”,接下来的两个代码将意味着并被编译成相同的代码:

1.

Container(
   child: Retry()
)
Run Code Online (Sandbox Code Playgroud)
Container(
   child: const Retry()
)
Run Code Online (Sandbox Code Playgroud)

这是假设 dart 可以推断他必须使用const声明了该选项的类的构造函数吗?或者不是?我如何证实它?

Vya*_*rov 5

不,Dart 编译器不会推断,const除非语法上下文需要 constness,例如,如果您将const [A()]其写入A()const 上下文,这意味着const [A()]与 相同const [const A()],很少有其他地方适用相同的情况(例如 元数据@A())。

一般来说,Dart 编译器无法const在语言规范要求的地方之外进行推断,因为它可能会改变程序的语义。考虑:

class A {
  const A();
}

final Set<A> s = <A>{};
void foo(A a) {
  s.add(a);
}

void main() {
  foo(A());
  foo(A());
  print(s.length);
}
Run Code Online (Sandbox Code Playgroud)

如果编译器只是进行const构造函数调用,那么该程序将打印1,但它应该打印2