template<int>
struct DerivedTagImpl
{
struct Inner : BaseTag
{};
};
}
using DerivedTag = detail::DerivedTagImpl<0>;
void f(BaseTag&)
{
std::cout << "BaseTag" << std::endl;
}
template<int Index>
void f(typename detail::DerivedTagImpl<Index>::Inner& tag)
{
std::cout << "detail::DerivedTagImpl<>::Inner" << std::endl;
f(static_cast<BaseTag&>(tag));
}
DerivedTag::Inner obj;
f(obj);
Почему здесь в последней строке компилятор выбирает f(BaseTag&)?
(wandbox: https://wandbox.org/permlink/k9KfoeqP7v2ddZq6)
Поясню свою недоумение: я понимаю, что f(BaseTag&) более специализированная, однко для шаблонной версии f в данном случае не нужно делать никаких преобразований, т.е. она для параметра лучше подходит
Обсуждают сегодня