message: Use default arguments properly
  Summary:
  When writing {D5380679} I was under the impression that we could not
  evaluate default argument expressions at runtime, but I clearly have a poor
  mental model of C++.
  oopsie
diff: * Walk all methods of all classes defined in 'scope' calling back
  * the walker function in parallel. Make sure all global
  * information needed is copied locally per thread using DataInitializerFn.
  + *
  + * This code usually runs on a processor with Hyperthreading, where the number
  + * of physical cores is half the number of logical cores. Setting num_threads
  + * to that number often gets us good results, so that's the default.
  */
  template <class T,
  class Data,
  @@ -31,18 +35,13 @@ template <class T,
  class MethodWalkerFn = Output(Data&, DexMethod*),
  class OutputReducerFn = Output(Output, Output),
  class DataInitializerFn = Data(int)>
  -Output walk_methods_parallel(const T& scope,
  +Output walk_methods_parallel(
  + const T& scope,
  MethodWalkerFn walker,
  OutputReducerFn reducer,
  DataInitializerFn data_initializer,
  const Output& init = Output(),
  - size_t num_threads = 0) {
  - if (num_threads == 0) {
  - // This code is running mostly on a Hyperthread processor.
  - // It often outperforms when the thread number equals to physical cores.
  - num_threads = std::thread::hardware_concurrency() / 2;
  - }
  -
  + size_t num_threads = std::thread::hardware_concurrency() / 2) {
  auto wq = WorkQueue<DexClass*, Data, Output>(
  [&](Data& data, DexClass* cls) {
  Output out = init;
  