> -----Original Message-----
> From: Martin Sebor [mailto:[EMAIL PROTECTED] On Behalf Of Martin Sebor
> Sent: Monday, July 07, 2008 5:44 PM
> To: dev@stdcxx.apache.org
> Subject: Re: Another potential hole in the tuple specs
> 
> Eric Lemings wrote:
> >  
> > 
> > Here's another potential problem with the tuple spec.  The 
> latest draft
> > declares std::ignore like so:
> >  
> >     namespace std {
> >         const /*unspecified*/ ignore;
> >     }
> >  
> > The type of std::ignore is implementation-defined but for 
> illustration,
> > let's say its defined like this:
> > 
> >     namespace std {
> > 
> >     struct _Ignore
> >     {
> >         template <class _Type>
> >         _Ignore& operator= (const _Type& value) { return *this; }
> >     };
> > 
> >     const _Ignore ignore = _Ignore ();
> > 
> >     } // namespace std
> > 
> > (The need for the operator will become evident shortly.)
> > 
> > Here's how the tie() function is specified, quoting from 
> the standard:
> > 
> >       template<class... Types}
> >       tuple<Types&...> tie(Types&... t);
> > 
> >     4 Returns: tuple<Types&>(t...). When an argument in t is ignore,
> > assigning any value to the corresponding
> >       tuple element has no effect.
> > 
> >     5 [ Example: tie functions allow one to create tuples that
> > unpack tuples into variables. ignore can be used for
> >         elements that are not needed:
> > 
> >             int i; std::string s;
> >             tie(i, ignore, s) = make_tuple(42, 3.14, "C++");
> >             // i == 42, s == "C++"
> > 
> >       -end example ]
> > 
> > In the example, the return type of the call to the tie() function is
> > std::tuple<int&, const std::_Ignore&, std::string&>.  Note that the
> > second element type in the tuple is a constant reference.  
> Regardless of
> > the implementation-defined type of std::ignore, isn't it 
> impossible to
> > change the value of a constant reference once initialized?  
> This would
> > mean the example shown above is ill-formed I believe.
> 
> You mean because tie(i, ignore, s) = make_tuple(42, 3.14, "C++")
> must assign 3.14 to std::ignore? Would declaring the assignment
> operator cost be a way to make it work?

A const assignment operator?  Sounds unorthodox but I'll try it out.

My current workaround is to declare std::ignore mutable (i.e.
non-const).  A const assignment operator (if it works) would be
preferable; no visible workaround required.

Brad.

Reply via email to