This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
constexpr question
- From: Andy Gibbs <andyg1001 at hotmail dot co dot uk>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Thu, 9 Jun 2011 13:26:31 +0200
- Subject: constexpr question
Hi,
I've been playing around with constexpr in gcc 4.6 and have a question:
This works:
template <int v> struct wrapper
{ enum : int { value = v }; };
constexpr int test1(int a)
{ return a; }
constexpr int test2(int a)
{ return test1(a); }
constexpr int one = 12;
constexpr int two = wrapper<test2(one)>::value;
But this doesn't work:
constexpr int test3(int a)
{ return wrapper<test1(a)>::value; }
constexpr int three = test3(one);
The compiler error is:
In function 'constexpr int test3(int)':
error: 'a' is not a constant expression
note: in template argument for type 'int'
The question I have is: why doesn't (or can't) the second case work? In
function 'test2' the compiler believes 'a' is a constant expression and the
declaration of variable 'two' shows 'wrapper' can take a constexpr as its
template parameter, so is it just an oversight of the compiler that 'test3'
doesn't compile? Or is it intentional?
I understand that test3 would not compile if passed a non-constexpr
parameter, whereas test2 would compile -- but this is what I would want:
this way I can stop test3 being used except during compile-time. Or is
there a better way of doing this?
Thanks for any help!
Andy