stdcxx-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Sebor (JIRA)" <j...@apache.org>
Subject [jira] Commented: (STDCXX-500) 1 + std::deque::iterator ambiguous without debugging iterators
Date Tue, 11 Mar 2008 22:08:46 GMT

    [ https://issues.apache.org/jira/browse/STDCXX-500?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12577626#action_12577626
] 

Martin Sebor commented on STDCXX-500:
-------------------------------------

As Dennis noted above, the C++ 1998 standard requires, in Table 76, that {{RandomAccessIterator}}s
support the following expressions (among others):

||expression||return type||operational semantics||assertion/note/pre-post-condition||
|{{a + n}}, {{n + a}}|{{X}}| {{\{X tmp = a; return tmp += n;\}}}|{{a + n == n + a.}}|

where {{a}} denotes a value of ??RandomAccessIterator?? and {{n}} denotes a value of difference
type {{Distance}}.

The stdcxx declaration of {{deque::iterator::operator+()}} looks like this:

{code}
template <class _TypeT, class _DiffT, class _Ptr, class _Ref, class _Alloc>
inline __rw_deque_iter<_TypeT, _DiffT, _Ptr, _Ref, _Alloc>
operator+ (_DiffT, const __rw_deque_iter<_TypeT, _DiffT, _Ptr, _Ref, _Alloc>&);
{code}

Calling this {{operator+}} with the first argument of type other than {{deque::iterator::difference_type}}
will inevitably be ambiguous, even though the operator conforms to the requirements in Table
76. I posted a note ({{c\+\+std-lib-20410}}) to [mailto:c++std-lib@accu.org]. Doug Gregor's
response ({{c\+\+std-lib-20414}}) indicates that this might be a known but undocumented problem
with Iterator Requirements but he also says that Concepts will resolve  the ambiguity. It's
not yet clear to me how.

> 1 + std::deque::iterator ambiguous without debugging iterators
> --------------------------------------------------------------
>
>                 Key: STDCXX-500
>                 URL: https://issues.apache.org/jira/browse/STDCXX-500
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 24. Iterators
>    Affects Versions: 4.1.3, 4.2.0
>         Environment: HP aCC 6.0
>            Reporter: Martin Sebor
>            Assignee: Martin Sebor
>             Fix For: 4.2.1
>
>   Original Estimate: 8h
>  Remaining Estimate: 8h
>
> Moved from Rogue Wave Bugzilla: http://bugzilla.cvo.roguewave.com/show_bug.cgi?id=1923
> -------- Original Message --------
> Subject: Re: FWD: Peren 6.4 and N + iterator & swap(deque, deque)
> Date: Mon, 18 Apr 2005 18:12:41 -0700 (PDT)
> From: Dennis Handly <dhandly@cup.hp.com>
> To: dhandly@cup.hp.com, sebor@roguewave.com
> CC: Boris.Gubenko@hp.com, mahesha@india.hp.com, sgganesh@india.hp.com
> >From: Dennis Handly <dhandly@cup.hp.com>
> >Or use deque directly:
> template <class _TypeT, class _Allocator>
> inline typename deque<_TypeT, _Allocator>::iterator
> operator+(typename deque<_TypeT,
> _Allocator>::iterator::difference_type __n,
>           typename deque<_TypeT, _Allocator>::iterator __rhs)
> {
>     return __rhs.operator+(__n);
> }
> This didn't work.  I need to also have one for const_iterator.
> And it seems the test is bad:
> error #2349: no operator "+" matches these operands
>             operand types are: int + std::deque<char,
>                       std::allocator<char>>::const_iterator
>         2+it04
>          ^
> 24(9) says that "n denotes a value of difference type Distance".
> So that this has to be "2L".  Or better yet:
>    ...:iterator::difference_type(2) + it04
> Does this seem like something we can get Perennial to change?
> Boris:
> Do we know how those other STLs work?  Do they have an extra int
> overloading?
> ------- Additional Comments From sebor@roguewave.com 2005-04-19 09:30:12 ----
> -------- Original Message --------
> Subject: Re: FWD: Peren 6.4 and N + iterator & swap(deque, deque)
> Date: Tue, 19 Apr 2005 10:29:32 -0600
> From: Martin Sebor <sebor@roguewave.com>
> To: Dennis Handly <dhandly@cup.hp.com>
> CC: Boris.Gubenko@hp.com,  mahesha@india.hp.com,  sgganesh@india.hp.com
> References: <200504190112.SAA17097@hpcll183.cup.hp.com>
> Dennis Handly wrote:
> >>From: Dennis Handly <dhandly@cup.hp.com>
> >>Or use deque directly:
> > 
> > template <class _TypeT, class _Allocator>
> > inline typename deque<_TypeT, _Allocator>::iterator
> > operator+(typename deque<_TypeT,
> _Allocator>::iterator::difference_type __n,
> >           typename deque<_TypeT, _Allocator>::iterator __rhs)
> > {
> >     return __rhs.operator+(__n);
> > }
> > 
> > This didn't work.  I need to also have one for const_iterator.
> > 
> > And it seems the test is bad:
> > error #2349: no operator "+" matches these operands
> >             operand types are: int + std::deque<char,
> >                       std::allocator<char>>::const_iterator
> >         2+it04
> >          ^
> > 
> > 24(9) says that "n denotes a value of difference type Distance".
> Ah. That's because the type of 2 is int but deque iterator's
> distance type (that the iterator's type depends on) is long.
> Darn! Those templates, they always get you! I'll have to think
> about this one some more. I created bug 1923 to remind me.
> > 
> > So that this has to be "2L".  Or better yet:
> >    ...:iterator::difference_type(2) + it04
> > 
> > Does this seem like something we can get Perennial to change?
> Strictly speaking I think the test is incorrect. 24.1, p1 says
> that n (used in Table 76) denotes a value of the difference type
> Distance, but 2 is not. But as a matter of QoI any integer should
> work.
> Martin
> ------- Additional Comments From sebor@roguewave.com 2005-04-19 09:31:08 ----
> Here's the test case:
> $ cat t.cpp && aCC -AA -V -c t.cpp
> #include <deque>
> void foo (std::deque<char>::const_iterator i)
> {
>     i + 2;
>     2 + i;
> }
> aCC: HP aC++/ANSI C B3910B A.06.00 [Aug 25 2004]
> "t.cpp", line 6: error #2349: no operator "+" matches these operands
>             operand types are: int + std::deque<char,
>                       std::allocator<char>>::const_iterator
>       2 + i;
>         ^
> 1 error detected in the compilation of "t.cpp".

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message