Re: Rvalue-references, binding and conversions
On 5 Dez., 02:18, SG <s.gesem...@gmail.com> wrote:
I appreciate the existence of rvalue references but IMHO their use
should be limited to exactly what they were designed for: move
semantics and perfect forwarding. While testing with concepts and
rvalue references I came across this problem:
[snip]
Here's an update. The problem is actually more subtle:
#include <iostream>
struct S {};
concept C<typename T> {}
concept_map C<S> {}
auto concept A<typename T> {}
template<C T> void foo(const T & x) { // #1
std::cout << "foo(const T &)\n";
}
template<C T> void foo(T && x) { // #2
std::cout << "foo(T &&)\n";
}
template<A T> void bar(const T & x) { // #3
std::cout << "bar(const T &)\n";
}
template<A T> void bar(T && x) { // #4
std::cout << "bar(T &&)\n";
}
int main() {
S lvl;
foo(lvl); // #1 with T=S where C<S>, !C<S&>
foo(S()); // #2 with T=S where C<S>
bar(lvl); // #4 with T=S& where A<S&>
bar(S()); // #4 with T=S where A<S>
}
Tested wit conceptg++ svn 727. So, function #4 attracts all non-const
objects (rvalue AND lvalue) which is NOT what was intended. The lesson
to be learned: Don't mix rvalue references with template parameter
deduction unless you want the type parameter deduced to be a reference
in case of lvalues.
Is there a way to somehow "disable" this deduction rule so #3 is
called on lvalues?
Cheers!
SG
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]