This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: Specializations of std::char_traits
On Wednesday, July 16, 2003, at 11:11AM, Nathan Myers wrote:
On Tue, Jul 15, 2003 at 04:39:04PM -0700, Matt Austern wrote:
We've received several complaints from customers who noticed that
std::char_traits<int> (or long, or signed char, or unsigned short, or
whatever) used to be defined but isn't defined anymore.
Now, just to be obvious, I realize that
- The C++ standard doesn't say there should be any specializations
other than char and wchar_t
- In general there's no way to define all of the members of
std::char_traits for an arbitrary type. There's no good way to say
what char_traits<T>::int_type should be, for example.
As I recall, the standard requires a default definition of
char_traits<T> for any T. (I recall the vote in favor, which I
opposed, if mildly.)
Yes and no. There must be a class template std::char_traits<T>
(there has to be a primary template to specialize!), but I don't see
anything in the standard saying that the primary template has to
have any of the members found in table 37. In fact, I'm not even
convinced there's a requirement that the primary template has to
be instantiable.
The standard is quite explicit about the member functions in the
std::char_traits<char> and std::char_traits<wchar_t> specializations
(clauses 21.1.3.1 and 21.1.3.2), but I believe users are entirely on
their own if they try to instantiate std::char_traits for any other
types.
I suggest that we should have a semi-useful primary template.
However, I also suggest that this primary template should define
only some of the members that the specializations do. I don't think
there's any useful definition of std::char_traits<T>::state_type for
arbitrary T, for example. Ditto for eof(), pos_type, and everything
that has to do with int_type.
--Matt