------- Comment #6 from dennis0yang at gmail dot com 2007-05-12 17:19 ------- Subject: Re: fail to link to static const double
I understand perfectly well everything you said. But I think you miss the point of this bug report. This is not about the c++ standard in terms of what should and should not be done. This is about get rid of the "luck" component in gcc. If gcc decides not to support in-class definition for static const double, then flag the statement as an error. I really don't see why the compile doesn't substitute the value everywhere it see the reference (as you mentioned), because it is a static const! fang at csl dot cornell dot edu wrote: > ------- Comment #5 from fang at csl dot cornell dot edu 2007-05-12 16:53 > ------- > Subject: Re: fail to link to static const double > > >> ------- Comment #3 from dennis0yang at gmail dot com 2007-05-12 09:29 >> ------- >> Subject: Re: fail to link to static const double >> >> I understand that the standard only specifies that static const for >> integral type can be assigned within the class. My point is that if gcc >> decides to allow the extension of assigning static const double within >> the class (good extension, I don't see why this is not in the >> standard.), then it should allow me to link to it. Note the code works >> if I change "y=-x" to "y= -1 * x", so it is clearly a bug. >> > > To *link* to something correctly with a reference, you need EXACTLY ONE > definition, same as in C. An in-class declaration is not a definition. > It cannot be treated as such because you'd end up with a definition in > each translation unit that includes the header (multiply defined). The > cases in which the compile/link 'worked' for you were cases in which the > compiler substituted the value for the reference (you got lucky). I don't > know the heuristics for the decision, maybe ask someone familiar with the > constant-folding opt. > > >> I also tried your suggestion before submitting the bug report. It does >> work. But I really do not want to create a .cpp file just to put that >> one line in it, much prefer to leave everything in the .h file. >> > > Defining it once in a .cpp file is the correct thing to do, even if it is > inconvenient. > > Hope this helps. > > >> fang at csl dot cornell dot edu wrote: >> >>> ------- Comment #1 from fang at csl dot cornell dot edu 2007-05-12 09:06 >>> ------- >>> You need to define Base::x out of class in some translation unit, the >>> in-class >>> declaration alone isn't enough, though sometimes the compiler will elide the >>> reference to it if its value is known (optimization). >>> >>> const double Base::x = 1.0; >>> > > > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31904