[
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:[EMAIL PROTECTED] 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 <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED], [EMAIL PROTECTED]
> CC: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
> >From: Dennis Handly <[EMAIL PROTECTED]>
> >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 [EMAIL PROTECTED] 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 <[EMAIL PROTECTED]>
> To: Dennis Handly <[EMAIL PROTECTED]>
> CC: [EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
> References: <[EMAIL PROTECTED]>
> Dennis Handly wrote:
> >>From: Dennis Handly <[EMAIL PROTECTED]>
> >>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 [EMAIL PROTECTED] 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.