The following compiles fine in macports gcc 4.7, but does not in clang svn 161307.  I believe the key is the const reference in combination with the ?: operator.<div><br></div><div><div>#include <stdexcept></div><div>

<br></div><div>struct A {</div><div>  constexpr A(int a) : value(a) {}</div><div><br></div><div>  constexpr int get() { return value; }</div><div><br></div><div>private:</div><div>  int value;</div><div>};</div><div><br>
</div>
<div>constexpr A someFn(const A& a) {</div><div>  return a.get() == 0 ? throw std::exception() : a;</div><div>}</div><div><br></div><div>int main(int argc, char** argv) {</div><div>  constexpr A a(4);</div><div>  static_assert( someFn(a).get() == 4, "error" );</div>

<div>}</div></div><div><br></div><div>Some digging on the internets reveals <a href="http://stackoverflow.com/questions/5605142/stdmax-and-stdmin-not-constexpr" target="_blank">http://stackoverflow.com/questions/5605142/stdmax-and-stdmin-not-constexpr</a>, which seems to point to lvalues, glvalues and memory allocation, although I did not follow it very well.  There is also the particularly interesting comment : </div>

<div><br></div><div><span style="color:rgb(68,68,68);font-family:Arial,'Liberation Sans','DejaVu Sans',sans-serif;font-size:13px;line-height:17px;text-align:left;background-color:rgb(250,250,250)">The C++ committee have suggested that it was intended to be possible for function invocation substitution to produce an lvalue referring to a temporary. g++ behaves that way, but clang currently implements the standard as written.</span></div>

<div><br></div><div>So, I have two questions.  1) Is the way clang handles this in fact conformant to the spec, and gcc is lax? 2) Can someone take another crack at explaining why it is that this doesn't work?</div><div>

<br></div><div>Thanks</div><div>--David  </div><div><br></div><div><br></div>