title: Forward arguments to wrapped base class member
body: <p>I want to write a <code>callback</code> - wrapper around <code>std::function</code> without <code>operator bool</code>, which will do nothing in <code>operator()</code> if wrapped <code>std::function</code> in <em>empty</em> state. Here is my idea</p>
  <pre class="lang-cpp prettyprint-override"><code>template &lt;class... Arguments&gt;
  struct callback : std::function&lt;void(Arguments...)&gt;
  {
      using base_t = std::function&lt;void(Arguments...)&gt;;
  
      using base_t::base_t;
  
      template &lt;class... Args&gt;
      void operator()(Args&amp;&amp;... args) const
      {
          if (!static_cast&lt;bool&gt;(static_cast&lt;base_t&gt;(*this)))
              return;
          base_t::operator()(std::forward&lt;Args&gt;(args)...);
      }
      
      operator bool() const = delete;
  };
  </code></pre>
  <p>But using my type in the next code results in compilation error</p>
  <pre class="lang-cpp prettyprint-override"><code>int main()
  {
      callback&lt;int&gt; f;
      f({});
  }
  </code></pre>
  <p>The error is:</p>
  <pre><code>&lt;source&gt;:22:6: error: no match for call to '(callback&lt;int&gt;) (&lt;brace-enclosed initializer list&gt;)'
     22 |     f({});
  </code></pre>
  <p>Using the next implementation compiles, but do not suits me</p>
  <pre class="lang-cpp prettyprint-override"><code>template &lt;class... Arguments&gt;
  struct callback : std::function&lt;void(Arguments...)&gt;
  {
      using base_t = std::function&lt;void(Arguments...)&gt;;
  
      using base_t::operator();
      operator bool() const = delete;
  };
  </code></pre>
  <p>Can someone please elaborate what is the difference between the two and is there a way to fix the error, but with my requirements?</p>