<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 20, 2015 at 9:43 AM, Justin Bogner <span dir="ltr"><<a href="mailto:mail@justinbogner.com" target="_blank">mail@justinbogner.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> writes:<br>
> On Fri, Feb 20, 2015 at 5:16 AM, Benjamin Kramer <<a href="mailto:benny.kra@googlemail.com">benny.kra@googlemail.com</a>><br>
> wrote:<br>
><br>
>     Author: d0k<br>
>     Date: Fri Feb 20 07:16:05 2015<br>
>     New Revision: 230010<br>
><br>
>     URL: <a href="http://llvm.org/viewvc/llvm-project?rev=230010&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=230010&view=rev</a><br>
>     Log:<br>
>     Make the static instance of None just const.<br>
><br>
>     This way there shouldn't be any unused variable warnings.<br>
><br>
>     Modified:<br>
>         llvm/trunk/include/llvm/ADT/None.h<br>
><br>
>     Modified: llvm/trunk/include/llvm/ADT/None.h<br>
>     URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/</a><br>
>     None.h?rev=230010&r1=230009&r2=230010&view=diff<br>
>     ==========================================================================<br>
>     ====<br>
>     --- llvm/trunk/include/llvm/ADT/None.h (original)<br>
>     +++ llvm/trunk/include/llvm/ADT/None.h Fri Feb 20 07:16:05 2015<br>
>     @@ -20,7 +20,7 @@ namespace llvm {<br>
>      /// \brief A simple null object to allow implicit construction of<br>
>     Optional<T><br>
>      /// and similar types without having to spell out the specialization's<br>
>     name.<br>
>      enum class NoneType { None };<br>
><br>
> At this point NoneType could just be an opaque/trivial struct instead of an<br>
> enum class?<br>
>  <br>
><br>
>     -static NoneType None;<br>
>     +const NoneType None = None;<br>
><br>
> Does this result in ODR violations? (either because None is not defined in the<br>
> program at all and it is ODR used, or because this is a definition (?) and<br>
> it's in multiple translation units? - I always forget which)<br>
<br>
</div></div>This should be fine. NoneType "satisfies the requirements for appearing<br>
in a constant expression", so based on [basic.def.odr].3 I don't think<br>
None will ever be odr-used. This should also mean that your idea of<br>
making this constexpr should be strictly clearer and equivalent.<br></blockquote><div><br>Ah, thanks for finding the right chapter & verse.<br><br>The full wording is:<br><br>"A variable whose name appears as a potentially-evaluated expression is odr-used unless it is an
object that satisfies the requirements for appearing in a constant expression (5.19) and the lvalue-to-rvalue
conversion (4.1) is immediately applied."<br><br>That latter requirement ("the lvalue-to-rvalue conversion is immediately applied") may be problematic, especially with regards to perfect forwarding.<br><br>It's possible we'd still need a definition if anyone did, say, this:<br><br>struct foo {<br>foo(ArrayRef<T>);<br>};<br>...<br>make_unique<foo>(None);<br><br>Because then the None value would be perfectly forwarded (which means taking a reference to it) through to foo's ctor... <br> </div></div>I think I'm still confusing myself at various points, because I can't quite make heads-or-tails of the behavior I'm seeing in a few experiments. Maybe it is just doing the right thing.</div></div>