Добавить const к ссылке - PullRequest
0 голосов
/ 02 мая 2018

Я хочу добавить 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<
 ^~~~~~~~~~~~~

1 Ответ

0 голосов
/ 02 мая 2018

Почему-то это не работает. Разве это не возможно в C ++?

Не так, как вы это делаете. typedef не работает как макросы препроцессора.

typedef int& A;
typedef const A B;

не переводится в

typedef int& A;
typedef const int& B;

const in

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&;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...