This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: constexpr question


On 9 June 2011 16:21, Andy Gibbs wrote:
>
> Thanks for your reply. ?I think that you're right that the compiler is
> probably working according to the logic you have suggested. ?Maybe it is a
> overlooked feature in the proposed new standard. ?I believe it isn't
> necessarily the case that you'd always want a constexpr function that also
> can be used as a normal (run-time) function since it may implement an
> algorithm suitable (i.e. possible) for compile-time use but unsuitable (i.e.
> inefficient) for run-time use. ?The idea, of course, would be to implement
> two different functions, one for use at compile-time, one for use at
> run-time. ?The problem for me is how to stop my users using the compile-time
> (i.e. inefficient) function at run-time. ?My experience is that
> documentation is often not enough! ?If it had worked, my wrapper idea would
> have been perfect: it would have stopped the compile-time function being
> used accidentally at run-time because the parameter wouldn't be constexpr
> and couldn't therefore be a template parameter; and the user would otherwise
> be able to decide whether to use the compile-time or the run-time function
> as he wished.

I don't think it's overlooked feature, I think the current behaviour
is by design.

[dcl.constexpr] p7 says it quite clearly:
A call to a constexpr function produces the same result as a call to
an equivalent non-constexpr function in all respects except that a
call to a constexpr function can appear in a constant expression.

N.B. _can_ appear in a constant expression. It must be a valid C++
function in all other respects, it is just possible to use in places
that didn't allow function calls previously.

A note on p1 says "Function parameters cannot be declared constexpr"
which precludes 'a' being a constant expression (it can only be
substituted by one during function invocation substitution, which only
occurs in the context of constant expressions.)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]