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]

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





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