
on Tue Jan 31 2012, "Robert Ramey"
Steven Watanabe wrote:
AMDG
On 01/31/2012 09:45 AM, Robert Ramey wrote:
So, I've implemented a specialization of std::numeric_limits for my special kind of integer - which is OK by me. BUT, now I wonder about the idea if placing my own code into the std namespace which I would guess might raise other issues.
Well this is sort of interesting. So it seems that I'm off the hook as far as specializing numeric_limits if I follow a couple of rules. Now it only remains to decipher the rules.
C++ 2003, 17.4.3.1: "A program may add template specializations for any standard library template to namespace std.
OK - got it.
Such a specialization (complete or partial) of a standard library template results in undefined behavior
Hmmm - not getting this. How does specialization result in undefined behavior. The whole purpose of specialization is to define behavior. Does this mean to say that any declared specialization should be defined or what?
"Undefined behavior" is a technical term, so it has specific meaning having nothing to do with what you mean when you say "the purpose... is to define behavior." To boil it down to basics, the standard is saying that on an arbitrary standard C++ implementation, unless the declaration depends on a user-defined name of external linkage and unless the specialization meets the standard library requirements for the original template you've done something illegal and all bets are off. And note, the type_traits, like is_arithmetic, are not open to extension by users. Those traits check fundamental type properties, and the set of arithmetic types (for example) is defined by the standard. Therefore the "meets the standard library requirements" restriction means you your user-defined numeric type is not an arithmetic type in the is_arithmetic sense. -- Dave Abrahams BoostPro Computing http://www.boostpro.com