Я хочу добавить const к ссылочному типу typedef const A B;
.
Как-то не получается. Разве это невозможно в C++?
Контрольная работа:
#include <type_traits>
typedef int& A;
typedef const A B; // <-- Add const
// typedef std::add_const<A>::type B; // also doesn't work.
static_assert(std::is_const<typename std::remove_reference<
B>::type>::value, "is const");
int main() {
return 0;
}
Ошибка компиляции:
add2.cpp:5:1: error: static assertion failed: is const
static_assert(std::is_const<typename std::remove_reference<
^~~~~~~~~~~~~
Somehow it doesn't work. Is this not possible in c++?
Не с тем, как вы это делаете. typedef
не работает как макросы препроцессора.
typedef int& A;
typedef const A B;
не переводится на
typedef int& A;
typedef const int& B;
const
в
typedef const A B;
относится к A
, а не к int
части A
. Поскольку ссылки в C++ неизменяемы, const A
совпадает с A
с точки зрения типа.
Ты можешь использовать:
typedef int const& B;
Если вы хотите получить его от A
, вы должны использовать:
using B = typename std::remove_reference<A>::type const&;
Если вы можете использовать C++ 14 или более позднюю версию, вы можете упростить это, чтобы:
using B = std::remove_reference_t<A> const&;
@Yakk, я впервые слышу это выражение. Спасибо за это.
К сожалению, std::add_const<T>
не подходит для ссылок.
Способ добавления const
к ссылке следующий:
using in_type = double&;
using out_type = std::add_lvalue_reference_t<std::add_const_t<std::remove_reference_t<in_type>>>;
static_assert( std::is_same<out_type, double const&>{} , "!");
West const снова проигрывает.