[cfe-dev] In-class initialization doesn't work for template

Jens Kilian jjk at gondolin.bb.bawue.de
Sat Jul 7 06:05:57 PDT 2012


For the following program, clang (see below for version) complains about the in-class initialization of a struct using a constant pointer, but only when it occurs in a template - the non-template case works:


struct foo
{
  int *pi;
};

struct fie
{
  static int i;
};

struct bar
{
  static constexpr foo f = { &fie::i };  // works
};

template <class T>
struct baz
{
  static constexpr foo f = { &T::i };    // error
};

class zip
{
  const foo *p, *q;
public:
  zip(void);
};

zip::zip(void) : p(&bar::f), q(&baz<fie>::f) {}


jjk$ clang++ --version
Apple clang version 3.1 (tags/Apple/clang-318.0.54) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
jjk$ clang++ --std=c++11 --stdlib=libc++ -O3 -S foo.cpp 
foo.cpp:19:24: error: in-class initializer for static data member of type 'const foo' requires 'constexpr' specifier
  static constexpr foo f = { &T::i };
                       ^   ~~~~~~~~~
  constexpr 
foo.cpp:29:33: note: in instantiation of template class 'baz<fie>' requested here
zip::zip(void) : p(&bar::f), q(&baz<fie>::f) {}
                                ^
1 error generated.


Is this a bug in clang, or am I doing something illegal?

Thanks,

	Jens.
-- 
mailto:jjk at acm.org         phone:+49-7031-4357-122
http://www.bawue.de/~jjk/  fax:+49-7031-4357-483
http://del.icio.us/jjk     As the air to a bird, or the sea to a fish,
                           so is contempt to the contemptible. [Blake]





More information about the cfe-dev mailing list