Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Есть класс свойств типа.
К>Это упражнение или велосипед? Если велосипед, то стоит посмотреть на boost::mpl, а если упражнение, то будем разбираться.
Это упражнение, конечно.
К>Дело в том, что тип T у функции выводится. Поскольку funcBy принимает "нечто типа T" по значению, то, что бы ей на вход ни подсунули, первым делом произойдёт неявное приведение к rvalue. А если lvalue->rvalue невозможно из-за приватного конструктора копирования, то будет ошибка компиляции.
К>Поэтому в первой строке T=int, во второй и третьей T=A. Даже если подсунуть туда const A, — всё равно const lvalue -> rvalue потеряет константность.
Да.. с выводом что-то затупил. Только вот про rvalue.. Почему к rvalue то приводится?
template<typename T>
void fooo(T i){T& ri=i;std::cout<<&i<<"fooo(T)\n";}
Берется адрес переменной, создается ссылка на нее. Значит i — lvalue. Или я не так понял что-то?
К>Кстати сказать, у переменной a и ссылки на ней ra тип один и тот же — это A, а вовсе не A&.
Да, действительно
std::cout<<(typeid(ii)==typeid(rii))<<std::endl;
выводит true. А почему так сделано?
К>Если же явно указывать параметр funcBy<int>, funcBy<A>, funcBy<A&>, funcBy<const A&> — то вывод будет ожидаемо разный.
Т.е. получается только таким образом можно использовать ParameterType? С явным указанием параметра?
funcBy<A&>(client::A_TypeTraits<A&>::ParameterType(ra));
Какая-то ерунда так получается. Приходится 2 раза писать тип