Re: Constrained Forwarding(R-Value Reference)
On 13 mar, 20:59, "Grizlyk" <grizl...@yandex.ru> wrote:
template <class It> It& increment(It&);
"It&" means "reference to copyable", so you have required much from the type
"It" to be "copyable". Any "moveable" (as auto_ptr) can not be used for the
template.
lt& doesn't mean "reference to copyable", it means "reference to
lvalue".
template <class It, class T>
It
foo(It first, It last, const T& x)
{
"const T&" means "reference to const copyable", so you have required from
the type "T" to be "copyable". Any "moveable" (as auto_ptr) can not be used
for the template.
Just declaring the parameter as const T& doesn't require T to be
Copyable.
The following type:
struct resource {
resource ();
int query (int param) const; // query resource on certain param
private:
resource (resource const&);
resource& operator= (resource const&);
void* stuff;
};
is not Copyable.
Now let me fill in this foo function:
template <typename Iterator, typename T>
Iterator
foo (Iterator begin, Iterator end, T const& t) {
for (; begin != end; ++begin) {
int result = t.query(*begin);
// operate with result somehow.
}
return begin;
}
Now, observe the following:
vector<int> params;
bar b;
foo(params.begin(), params.end(), b);
b is an lvalue binding to a const referente to lvalue, and b is of
type bar, and bar is not Copyable.
That declaration does not require the type bar to be Copyable.
references to lvalues are not necessarily references to values of
Copyable types.
lvalues are lvalues, Copyable types are Copyable types.
--
Pedro Lamar?o
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]