ISO/ IEC JTC1/SC22/WG21 N0731

                                        Doc.No.:  X3J16/95-0131
                                                  WG21/N0731
                                        Date:     6 July 1995
                                        Project:  Programming Language C++
                                        Reply to: Ichiro Koshida
                                        E-mail:   koshida@cc.teu.ac.jp


                        Japanese Public Review Comments

                            IPSJ/ITSCJ/SC22 C++WG


1. Introduction
This document presents the comments which are obtained in Japanese
public reviewing process for C++ standard. Thisis not a comprehensive
collection of comments. Rather, they are general or major points that
Japanese national bodyconsiders important, and wishes to discuss in this
meeting.

We have found three major issues in current Working Paper.

a) Implementation dependent extension.
b) String.
c) IOstream.

Followings are discussions about these issues. A detailed explanation of
 String issue are described in Appendix.


2. Implementation dependent extension  (by Akio Kido)
Category: Technical
Position: [intro.compliance]
Problem:
C standard allows implementation dependent extensions in a conforming
implementation as follows:

    A conforming implementation  may have extensions (including additional
    library functions), provided they do not alterthe behavior of any
    strictly conforming program. (In Section 1.7 Compliance)

Current C++ standard does not allow such implementation dependent
extensions.

Recommended Action:
Allow implementation dependent extensions in the same way as C standard.


3. String  (by Takanori Adachi)
Category: technical
Problem:
This is a list of comments to the string library as defined inthe latest
 WP.All the comments are technical ones that can be separated intothe
following two categories:

1) It is not sufficiently clear which members depend on traits
   or not.  I think that it is important to add notes to clarify
   the traits function names that should be used in the implementation
   of each member.

2) There are seven members using charT() as their default arguments.
   I think it is problematic in two points: one is on the possibility
   of defining eos() as the element which is different from charT().
   the other point is on the uncleanness of the dependency on traits.

Proposal:
Detailed comments and proposals are in Appendix.


4.IOstream  (by Norihiro Kumagai)

Category: technical
Position: [lib.ios.traits] page 27-7
           [lib.stream.types] page 27-7
Problem:
We cannot specify int_type, off_type, pos_type, and state_type
corresponding to some specialized charT type.

For example, if in order to think about 'char' specialization, we
might define

   template <class charT> struct ios_traits {
        ....
        typedef charT char_type;
        typedef int int_type;
        ....
   };

we would have to accept it as constant definition in all of the
specialized traits, not only ios_traits<char>, but
ios_traits<wchar_t>, ios_traits<ultrachar>.  It would lead to the
restriction upon implementations that all of the charT have to be
converted in 'int' range.  The restriction is too heave to future
wide character types and user-defined character types.

Proposed_action:

Adopt the following definition:

=============================

namespace std {
  template <class charT> struct ios_traits<charT> {}

  struct ios_traits<char> {
    typedef char char_type;
    typedef int  int_type;
    typedef streampos pos_type;
    typedef streamoff off_type;
    typedef mbstate_t state_type;

  // 27.4.2.2 values:
    static char_type  eos();
    static int_type   eof();
    static int_type   not_eof(char_type c);
    static char_type  newline();
    static size_t     length(const char_type* s);

  // 27.4.2.3 tests:
    static bool  eq_char_type(char_type, char_type);
    static bool  eq_int_type(int_type, int_type);
    static bool  is_eof(int_type);
    static bool  is_whitespace(const ctype<char_type> ctype&, char_type);

  // 27.4.2.4 conversions:
    static char_type  to_char_type(int_type);
    static int_type   to_int_type(char_type);
    static char_type* copy(char_type* dst, const char* src, size_t n);

    static state_type get_state(pos_type);
    static pos_type   get_pos(streampos fpos, state_type state);
  };

  struct ios_traits<wchar_t> {
    typedef wchar_t char_type;
    typedef wint_t  int_type;
    typedef wstreampos pos_type;
    typedef wstreamoff off_type;
    typedef mbstate_t state_type;

  // 27.4.2.2 values:
    static char_type  eos();
    static int_type   eof();
    static int_type   not_eof(char_type c);
    static char_type  newline();
    static size_t     length(const char_type* s);

  // 27.4.2.3 tests:
    static bool  eq_char_type(char_type, char_type);
    static bool  eq_int_type(int_type, int_type);
    static bool  is_eof(int_type);
    static bool  is_whitespace(const ctype<char_type> ctype&, char_type);

  // 27.4.2.4 conversions:
    static char_type  to_char_type(int_type);
    static int_type   to_int_type(char_type);
    static char_type* copy(char_type* dst, const char* src, size_t n);

    static state_type get_state(pos_type);
    static pos_type   get_pos(streampos fpos, state_type state);
  };
}

=========================

According to the separation of the two specializations, we have to
change the descriptions in [lib.streams.types], as follows;

## IN THE FOLLOWING DESCRIPTION, I APPENDED 'diff-mark' AT THE HEAD OF
## EACH LINES.

=======================
27.4.1 Types

  typedef OFF_T streamoff;

  The type streamoff is an implementation-defined type that satisfies
  the requirements of type OFF_T.

! typedef WOFF_T wstreamoff;

  The type wstreamoff is an implementation-defined type that satisfies
! the requirements of type WOFF_T.

  typedef POS_T streampos;

  The type streampos is an implementation-defined type that satisfies
  the requirements of type POS_T.

! typedef WPOS_T wstreampos;

  The type wstreampos is an implementation-defined type that satisfies
! the requirements of type WPOS_T.

! typedef SIZE_T streamsize;

===================

  The type streamsize is a synonym for one of the signed basic
  integral types.  It is used to represent the number of characters
  transferred in an I/O operations, or the size of I/O buffers.

Ccomment

We can find the above approach, "defining nothing in the template
version of traits and defining everything in each specializations", in
my original proposal(X3J16/94-0083).  I am afraid (and sorry) that one
of my mistakes made in my document for Austin(X1J16/95-0064) caused to
introduce such the inapproplate definitions to the current WP.

I feel this change request is in a kind of 'editorial' class.

We should not put any definitions(static member functions or typedefs)
related to int_type, off_type, pos_type and/or state_type in the
template definition of the traits.  The reason is that in fact these
three types depend on the template parameter class 'charT' for variety
of environments(ASCII, stateless encodings for double byte characters,
UniCode).  For example,

   charT      char                   wchar_t
   int_type   int                    wint_t
   off_type   streamoff              wstreamoff
   pos_type   streampos              wstreampos
   state_type mbstate_t              mbstate_t

Note that the two of the above types, 'wint_t', 'mbstate_t' are
defined in C Amendment 1 (or MSE).

We cannot assume that two implementation-defined types, streampos and
wstreampos have the same definitions because under some shift
encodings, wstreampos have to keep an additional information, the
shift state, as well as the file position.  we should represent them
with two different symbols, POS_T and WPOS_T so as to give a chance to
provide separate definitions in these two specializations.

For pos_type in both specialized traits, the type 'mbstate_t' is
introduced from C Amendment 1(or former MSE) and is an
implementation-defined type enough to represent any of shift states in
file encodings.

The type, INT_T is not suitable for the definition of streamsize
because INT_T represents another character type, whose meaning is
different to those of streampos.  So a new symbol 'SIZE_T' will need
to specify the definitions of streampos.



Appendix

Detailed comments to
  ______________________________________________________________________

  21   Strings library                                     [lib.strings]

  ______________________________________________________________________

by taka@miwa.co.jp
Version: July/5/95



  21.1.1.2  string_char_traits          [lib.string.char.traits.members]
       members

!begin
!category: technical
!problem:
An explaination for the implementation requirement has not been provided.

!proposed_action:
Provide the explaination, "the following default defintions, except
char_in, char_out, and is_del, are supposed to implement as
inline members." immediately after the line:

1 Default definitions.

!end



  21.1.1.3  Template class basic_string               [lib.basic.string]


!begin
!category: technical
!problem:
The usage of charT() as default arguments are not adequate in the
following seven members:

      basic_string& append(size_type n, charT c = charT());
      basic_string& assign(size_type n, charT c = charT());
      basic_string& insert(size_type pos, size_type n, charT c = charT() );
      iterator insert(iterator p, charT c = charT());
      iterator insert(iterator p, size_type n, charT c = charT());
      basic_string& replace(size_type pos, size_type n, charT c = charT());
      basic_string& replace(iterator i1, iterator i2,
                            size_type n, charT c = charT());

!proposed_action:
The default arguments charT() should be eliminated by separating
those members into two forms respectively and by using traits::eos()
instead of charT() as the followings:

      basic_string& append(size_type n, charT c);
      basic_string& append(size_type n);

      basic_string& assign(size_type n, charT c);
      basic_string& assign(size_type n);

      basic_string& insert(size_type pos, size_type n, charT c);
      basic_string& insert(size_type pos, size_type n);

      iterator insert(iterator p, charT c);
      iterator insert(iterator p);

      iterator insert(iterator p, size_type n, charT c);
      iterator insert(iterator p, size_type n);

      basic_string& replace(size_type pos, size_type n, charT c);
      basic_string& replace(size_type pos, size_type n);

      basic_string& replace(iterator i1, iterator i2,
                            size_type n, charT c);
      basic_string& replace(iterator i1, iterator i2,
                            size_type n);

!end


  21.1.1.4  basic_string constructors                  [lib.string.cons]


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string(const basic_string<charT,traits,Allocator>& str,
               size_type pos = 0, size_type n = npos,
               Allocator& = Allocator());

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string(const charT* s, size_type n,
               Allocator& = Allocator());

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string(const charT* s, Allocator& = Allocator());

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string(size_type n, charT c, Allocator& = Allocator());

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    operator=(const basic_string<charT,traits,Allocator>& str);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    operator=(const charT* s);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end

  basic_string<charT,traits,Allocator>& operator=(charT c);


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>& operator=(charT c);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end


  21.1.1.8.1  basic_string::operator+=                [lib.string::op+=]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    operator+=(const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>& operator+=(const charT* s);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end



!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>& operator+=(charT c);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end


  21.1.1.8.2  basic_string::append                  [lib.string::append]


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    append(const basic_string<charT,traits,Allocator>& str, size_type pos = 0,
           size_type n = npos);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    append(const charT* s, size_type n);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>& append(const charT* s);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end


  basic_string<charT,traits,Allocator>&
    append(size_type n, charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  basic_string<charT,traits,Allocator>&
    append(size_type n, charT c);

and add a new member with the following signature:

  basic_string<charT,traits,Allocator>&
    append(size_type n);

  Returns:
    append(n,traits::eos()).

  Notes:
    Uses traits::eos() and traits::assign().

!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    append(size_type n, charT c);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end


  21.1.1.8.3  basic_string::assign                  [lib.string::assign]


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    assign(const basic_string<charT,traits>& str, size_type pos = 0,
           size_type n = npos);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    assign(const charT* s, size_type n);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>& assign(const charT* s);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end


  basic_string<charT,traits,Allocator>&
    assign(size_type n, charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  basic_string<charT,traits,Allocator>&
    assign(size_type n, charT c);

and add a new member with the following signature:

  basic_string<charT,traits,Allocator>&
    assign(size_type n);

  Returns:
    assign(n,traits::eos()).

  Notes:
    Uses traits::eos() and traits::assign().

!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    assign(size_type n, charT c);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end


  21.1.1.8.4  basic_string::insert                  [lib.string::insert]


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    insert(size_type pos1,
           const basic_string<charT,traits,Allocator>& str,
           size_type pos2 = 0, size_type n = npos);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    insert(size_type pos, const charT* s, size_type n);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    insert(size_type pos, const charT* s);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end


  basic_string<charT,traits,Allocator>&
    insert(size_type pos, size_type n, charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  basic_string<charT,traits,Allocator>&
    insert(size_type pos, size_type n, charT c);

and add a new member with the following signature:

  basic_string<charT,traits,Allocator>&
    insert(size_type pos, size_type n);

  Returns:
    insert(pos, n, tratis::eos()).

  Notes:
    Uses traits::eos() and traits::assign().

!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    insert(size_type pos, size_type n, charT c);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end


  iterator insert(iterator p, charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  iterator insert(iterator p, charT c);

and add a new member with the following signature:

  iterator insert(iterator p);

  Requires:
    p is a valid iterator on *this.
  Effects:
    inserts a copy of traits::eos() before the character referred to by p.
  Returns:
    p.
  Notes:
    Uses traits::eos().

!end


  iterator insert(iterator p, size_type n, charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  iterator insert(iterator p, size_type n, charT c);

and add a new member with the following signature:

  iterator insert(iterator p, size_type n);

  Requires:
    p is a valid iterator on *this.
  Effects:
    inserts n copies of traits::eos() before the character referrred to by p.
  Returns:
    p.
  Notes:
    Uses traits::eos().

!end



  21.1.1.8.5  basic_string::remove                  [lib.string::remove]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    remove(size_type pos = 0, size_type n = npos);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end


  21.1.1.8.6  basic_string::replace                [lib.string::replace]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    replace(size_type pos1, size_type n1,
            const basic_string<charT,traits,Allocator>& str,
            size_type pos2 = 0, size_type n2 = npos);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    replace(size_type pos, size_type n1, const charT* s, size_type n2);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    replace(size_type pos, size_type n1, const charT* s);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end


  basic_string<charT,traits,Allocator>&
    replace(size_type pos, size_type n, charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  basic_string<charT,traits,Allocator>&
    replace(size_type pos, size_type n, charT c);

and add a new member with the following signature:

  basic_string<charT,traits,Allocator>&
    replace(size_type pos, size_type n);

  Returns:
    replace(pos,n,traits::eos()).
  Notes:
    Uses traits::eos().

!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>&
    replace(size_type pos, size_type n, charT c);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::assign().

!end


  basic_string& replace(iterator i1, iterator i2, size_type n,
                        charT c = charT());
!begin
!category: technical
!problem:
The usage of charT() as a default argument will become not adequate
when the non-default null character is defined in the traits.
!proposed_action:
Remove the default argument like

  basic_string& replace(iterator i1, iterator i2, size_type n, charT c);

and add a new member with the following signature:

  basic_string& replace(iterator i1, iterator i2, size_type n);

  Returns:
    replace(i1,i2,n,traits::eos()).
  Notes:
    Length change: n - (i2 - i1).
    Uses traits::eos().

!end


  21.1.1.8.7  basic_string::copy                      [lib.string::copy]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type copy(charT* s, size_type n, size_type pos = 0);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end



  21.1.1.9.1  basic_string::find                      [lib.string::find]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find(const charT* s, size_type pos, size_type n) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find(const charT* s, size_type pos = 0) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::eq().
                          ~~~~~~~~~~~~~~~~
!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find(charT c, size_type pos = 0) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end


  21.1.1.9.2  basic_string::rfind                    [lib.string::rfind]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type rfind(const charT* s, size_type pos, size_type n) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type rfind(const charT* s, size_type pos = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::eq().
                          ~~~~~~~~~~~~~~~~
!end


!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type rfind(charT c, size_type pos = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end


  21.1.1.9.3                                 [lib.string::find.first.of]
       basic_string::find_first_of

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type
    find_first_of(const charT* s, size_type pos, size_type n) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_first_of(const charT* s, size_type pos = 0) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::eq().
                          ~~~~~~~~~~~~~~~~
!end



!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_first_of(charT c, size_type pos = 0) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end


  21.1.1.9.4  basic_string::find_last_of      [lib.string::find.last.of]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_last_of(const charT* s, size_type pos, size_type n) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_last_of(const charT* s, size_type pos = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::eq().
                          ~~~~~~~~~~~~~~~~
!end



!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_last_of(charT c, size_type pos = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end


  21.1.1.9.5                             [lib.string::find.first.not.of]
       basic_string::find_first_not_of

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type
    find_first_not_of(const charT* s, size_type pos, size_type n) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_first_not_of(const charT* s, size_type pos = 0) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::eq().
                          ~~~~~~~~~~~~~~~~
!end



!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_first_not_of(charT c, size_type pos = 0) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end


  21.1.1.9.6                              [lib.string::find.last.not.of]
       basic_string::find_last_not_of

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_last_not_of(const charT* s, size_type pos,
                             size_type n) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_last_not_of(const charT* s, size_type pos = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::eq().
                          ~~~~~~~~~~~~~~~~
!end



!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  size_type find_last_not_of(charT c, size_type pos = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::eq().

!end


  21.1.1.9.7  basic_string::substr                  [lib.string::substr]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  basic_string<charT,traits,Allocator>
    substr(size_type pos = 0, size_type n = npos) const;

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end


  21.1.1.10.1  operator+                               [lib.string::op+]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    basic_string<charT,traits,Allocator>
      operator+(const basic_string<charT,traits,Allocator>& lhs,
                const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    basic_string<charT,traits,Allocator>
      operator+(const charT* lhs,
                const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    basic_string<charT,traits,Allocator>
      operator+(charT lhs,
                const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    basic_string<charT,traits,Allocator>
      operator+(const basic_string<charT,traits,Allocator>& lhs,
                const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::copy().
                          ~~~~~~~~~~~~~~~~~~
!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    basic_string<charT,traits,Allocator>
      operator+(const basic_string<charT,traits,Allocator>& lhs,
                charT rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::copy().

!end


  21.1.1.10.2  operator==                       [lib.string::operator==]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator==(const basic_string<charT,traits,Allocator>& lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator==(const charT* lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator==(const basic_string<charT,traits,Allocator>& lhs,
                    const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().
                          ~~~~~~~~~~~~~~~~~~~~~
!end


  21.1.1.10.3  operator!=                             [lib.string::op!=]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator!=(const charT* lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator!=(const basic_string<charT,traits,Allocator>& lhs,
                    const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().
                          ~~~~~~~~~~~~~~~~~~~~~
!end


  21.1.1.10.4  operator<                               [lib.string::op<]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator< (const basic_string<charT,traits,Allocator>& lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator< (const charT* lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator< (const basic_string<charT,traits,Allocator>& lhs,
                    const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end


  21.1.1.10.5  operator>                               [lib.string::op>]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator> (const basic_string<charT,traits,Allocator>& lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator> (const charT* lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator> (const basic_string<charT,traits,Allocator>& lhs,
                    const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end


  21.1.1.10.6  operator<=                             [lib.string::op<=]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator<=(const basic_string<charT,traits,Allocator>& lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator<=(const charT* lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator<=(const basic_string<charT,traits,Allocator>& lhs,
                    const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end


  21.1.1.10.7  operator>=                             [lib.string::op>=]

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator>=(const basic_string<charT,traits,Allocator>& lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator>=(const charT* lhs,
                    const basic_string<charT,traits,Allocator>& rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end

!begin
!category: technical
!problem:
Missing notes concerning the usage of traits members for:

  template<class charT, class traits, class Allocator>
    bool operator>=(const basic_string<charT,traits,Allocator>& lhs,
                    const charT* rhs);

!proposed_action:
Add notes like:

  Notes:
    Uses traits::length() and traits::compare().

!end