Если мы посмотрим на объявление std::as_const, мы увидим следующее:
template< class T >
constexpr std::add_const_t& as_const( T& t ) noexcept;
Он возвращает std::add_const_t&, который, согласно cppreference.com, выглядит следующим образом:
template< class T >
using add_const_t = typename add_const::type;
А add_const выглядит так:
template
struct add_const
{
typedef const T type;
};
Итак, он объявляет структуру, содержащую только typedef для постоянной версии типа шаблона, и, когда as_const(T& t) возвращает t, он преобразует его в const через это определение типа.
Итак, почему std::as_const не может выглядеть просто так?
template
constexpr const T& as_const(T& t) noexcept
{
return t;
}
Я создал тестовый код:
template
constexpr const T& my_as_const(T& t) noexcept
{
return t;
}
struct foo
{
void m() { std::cout
Подробнее здесь: https://stackoverflow.com/questions/790 ... omplicated