Monday, 15 July 2013

c++ - Function initialization with int& argument by int&& -



c++ - Function initialization with int& argument by int&& -

i have next code:

#include <type_traits> struct ttype { int = 0; bool operator() (int&) { homecoming true; } }; int main() { static_assert(std::is_same<decltype(std::declval<ttype>()(std::declval<int>())), bool>::value, "wtf?"); homecoming 0; }

if seek compile g++-4.8.2 receive error:

main.cpp:321:82: error: no match phone call ‘(jetplane) (int)’ static_assert(std::is_same<decltype(std::declval<jetplane>()(std::declval<int>())), bool>::value, "wtf?"); ^ main.cpp:265:8: note: candidate is: struct jetplane ^ main.cpp:279:7: note: bool jetplane::operator()(int&) bool operator() (int&) ^ main.cpp:279:7: note: no known conversion argument 1 ‘int’ ‘int&’

i don't understand note: no known conversion argument 1 ‘int’ ‘int&’ line. question is: why g++ interprets homecoming type of std::declval<int>() int , not line int&& though std::declval declaration looks like:

template< class t > typename std::add_rvalue_reference<t>::type declval();

i understand it's prohibited bind int&& int. why compiler doesn't print: note: no known conversion argument 1 ‘int’ ‘int&’ line. may don't understand , compiler changes somehow homecoming type of std::declval<int>() int&& on int in std::declval<ttype>()(std::declval<int>())?

thank help!

the problem is, cannot bind xvalue non-const lvalue reference.

let's @ expression

std::declval<int>()

the homecoming type of std::declval<int> indeed int&&. hence above look xvalue look of type int. note in c++ look never has reference type.

but operator

bool operator() (int&)

takes argument non-const lvalue referenece. if alter perameter type const int&, i.e.

bool operator() (const int&)

everything should work fine.

c++ c++11

No comments:

Post a Comment