The following code doesn't emit an error:

        class Curious {
        public:
            static const float c5 = 7.0;
        };

The above code is illegal according to the following references. The compiler
does not emit an error (instead the error is caught at link-time if the member
constant is not defined).

According to paragraph 9.4.2.4 of the standard:
If a static data member is of const integral or const enumeration type, its
declaration in the class definition can specify a constant initializer which
shall be an integral constant expression (5.9). [...] The member shall still be
defined in a namespace scope if it used in the program and the namespace scope
definition shall not contain an initializer.

See also paragraph 10.4.6.2 of Stroustrup's "The C++ Programming Language":
It is also possible to initialize a static integral constant member by adding a
constant-expression initializer to its member declaration. For example:
        class Curious {
        public:
            [...]
            static const float c5 = 7.0;    // error: in-class not integral
            [...]

It's a good idea to flag this error to avoid errors that are more difficult to
catch at link-time. Apparently GCC does not require integral member constants to
be defined, but it does require other member constants to be defined somewhere.
Why not help enforce this at compile-time?

-- 
           Summary: declaration/initialization of non-integral member
                    constants: compiler does not emit error
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: papadopo at shfj dot cea dot fr
                CC: gcc-bugs at gcc dot gnu dot org
  GCC host triplet: sparc-sun-solaris2.8


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21499

Reply via email to