incubator-stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Eric Lemings" <Eric.Lemi...@roguewave.com>
Subject RE: Another potential hole in the tuple specs
Date Tue, 08 Jul 2008 00:27:40 GMT
 

> -----Original Message-----
> From: Martin Sebor [mailto:msebor@gmail.com] 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.

Mime
View raw message