<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 7 April 2017 at 15:00, Agustín Bergé <span dir="ltr">&lt;<a href="mailto:agustinberge@gmail.com" target="_blank">agustinberge@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 4/7/2017 5:19 PM, Richard Smith wrote:<br>
&gt; On 30 March 2017 at 19:14, Agustín Bergé &lt;<a href="mailto:agustinberge@gmail.com">agustinberge@gmail.com</a><br>
</span><span class="">&gt; &lt;mailto:<a href="mailto:agustinberge@gmail.com">agustinberge@gmail.com</a><wbr>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     LWG2911 gave us the new `is_aggregate` trait, but no feature-test macro.<br>
&gt;     I would like to suggest `__cpp_lib_is_aggregate`. What follows is a<br>
&gt;     motivational use case, courtesy of Jonathan Wakely:<br>
&gt;<br>
&gt;          #include &lt;vector&gt;<br>
&gt;          template&lt;typename T, typename... Args&gt;<br>
&gt;          T make(Args&amp;&amp;... args)<br>
&gt;          {<br>
&gt;          #if __cpp_lib_is_aggregate<br>
&gt;              if constexpr (std::is_aggregate_v&lt;T&gt;)<br>
&gt;                  return { std::forward&lt;Args&gt;(args)... };<br>
&gt;              else<br>
&gt;          #endif<br>
&gt;                  return T(std::forward&lt;Args&gt;(args)...)<wbr>;<br>
&gt;          }<br>
&gt;          struct Agg { int i; };<br>
&gt;          int main()<br>
&gt;          {<br>
&gt;              auto v = make&lt;std::vector&lt;int&gt;&gt;(1, 2);<br>
&gt;          #if __cpp_lib_is_aggregate<br>
&gt;              // make&lt;&gt; only supports aggregates if std::is_aggregate is<br>
&gt;     available<br>
&gt;              auto a = make&lt;Agg&gt;(1);<br>
&gt;<br>
&gt;<br>
&gt; What does the #else look like here? I&#39;m not yet seeing how this feature<br>
&gt; test macro is useful.<br>
&gt;<br>
&gt;          #endif<br>
&gt;          }<br>
<br>
</span>There is no #else form here, the example is depicting a program with<br>
decreased functionality. A user of `make` that depends on the feature<br>
simply uses it, and it results in a compilation error when the feature<br>
is not present:<br>
<br>
     int main()<br>
     {<br>
<span class="">         auto a = make&lt;Agg&gt;(1);<br>
     }<br>
<br>
</span>Whereas a user of `make` that does not depend on the feature simply does<br>
not use it, and lack of support for the feature does not result in a<br>
compilation error:<br>
<span class=""><br>
     int main()<br>
     {<br>
         auto v = make&lt;std::vector&lt;int&gt;&gt;(1, 2);<br>
     }<br>
<br>
</span>The feature test macro is needed for the implementation of `make`, in<br>
order to support both use cases.</blockquote><div><br></div><div>This &#39;make&#39; seems like a terrible idea, but you&#39;ve convinced me that people might make use of the feature test macro.</div></div></div></div>