[Development] Proposal: Deprecating platforms in Qt 5.6 that don't support lambda
Thiago Macieira
thiago.macieira at intel.com
Thu Feb 19 20:36:04 CET 2015
On Thursday 19 February 2015 12:07:04 Matthew Woehlke wrote:
> On 2015-02-19 07:29, Daniel Teske wrote:
> > Qt's container classes and C++11 range based for loop do not mix very
> > well.
> > Ranged based for uses std::begin(container), which if not overloaded calls
> > container.begin(), which detaches.
>
> As an aside, the "correct" fix for this IMHO is for range-based for to
> support a mechanism for marking the RHS 'const', whether or not it
> otherwise would be so.
>
> Worst case, Qt could (should?) implement something like:
>
> struct QConstWrapper<ContainerType>
> {
> ContainerType::const_iterator begin() const;
> ContainerType::const_iterator end() const;
> // remaining "magic" elided
> };
>
> QConstWrapper<ContainerType> qConst(ContainerType const&);
>
> That said, note that range-based for also differs from foreach in that
> the former operates on the original container, whereas the latter
> operates on a copy.
It actually needs to be:
template <typename T> const T qConst(const T &t) { return t; }
It needs to create a copy and return it. There's a gotcha with range-based for
that it is defined in such a way that your temporaries may be destroyed before
the iteration. The standard defines it as:
{
auto && __range = <your range>;
for ( auto __begin = std::begin(__range),
__end = std::end(__range);
__begin != __end;
++__begin ) {
<for-range-declaration> = *__begin;
<statement>
}
}
If you have a temporary in your right hand of the ':' it will get lifetime-
extended by that __range reference. Any other temporaries will get destroyed.
That means a cast works and a copy works. Returning a reference doesn't.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
More information about the Development
mailing list