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