title: Idiomatic way to distinguish two zero-arg constructors
body: <p>I have a class like this:</p>
  
  <pre><code>struct event_counts {
      uint64_t counts[MAX_COUNTERS];
  
      event_counts() : counts{} {}
  
      // more stuff
  
  };
  
  </code></pre>
  
  <p>Usually I want to default (zero) initialize the <code>counts</code> array as shown.</p>
  
  <p>At selected locations identified by profiling, however, I'd like to suppress the array initialization, because I know the array is about to be overwritten, but the compiler isn't smart enough to figure it out.</p>
  
  <p>What's an idiomatic and efficient way to create such a "secondary" zero-arg constructor? </p>
  
  <p>Currently, I'm using a tag class <code>uninit_tag</code> which is passed as a dummy argument, like so:</p>
  
  <pre><code>struct uninit_tag{};
  
  struct event_counts {
      uint64_t counts[MAX_COUNTERS];
  
      event_counts() : counts{} {}
  
      event_counts(uninit_tag) {}
  
      // more stuff
  
  };
  </code></pre>
  
  <p>Then I call the no-init constructor like <code>event_counts c(uninit_tag{});</code> when I want to suppress construction.</p>
  
  <p>I'm open to solutions that don't involve the creation of a dummy class, or are more efficient in some way, etc.</p>