Как проверить, является ли ссылка постоянной? - PullRequest
0 голосов
/ 23 ноября 2018

Я писал тест для своих типов итераторов и хотел проверить, что ссылка, возвращаемая итераторами разыменования, предоставленными begin() и cbegin(), является неконстантной и константной соответственно.

Я пыталсяделая что-то похожее на следующее: -

#include <type_traits>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec{0};

    std::cout << std::is_const<decltype(*vec.begin())>::value << std::endl;
    std::cout << std::is_const<decltype(*vec.cbegin())>::value << std::endl;
}

Но это печатает 0 для обоих случаев.

Есть ли способ проверить, является ли ссылка константной?

Я могу использовать функции C ++ 11/14/17.

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Вы можете проверить примечания к документу здесь: https://en.cppreference.com/w/cpp/types/is_const

  • Примечания

Если T является ссылочным типом, тогда is_const :: value всегдаложный.Правильный способ проверить потенциально-ссылочный тип на предмет константности - удалить ссылку: is_const :: type>.

for(auto it=vec.begin(); it!=vec.end(); ++it) {
    std::cout << std::is_const<std::remove_reference<decltype(*it)>::type>::value << std::endl;
}

for(auto it=vec.cbegin(); it!=vec.cend(); ++it) {
    std::cout << std::is_const<std::remove_reference<decltype(*it)>::type>::value << std::endl;
}
0 голосов
/ 23 ноября 2018

*it будет ссылочным, а не ссылочным типом (int& или const int& вместо int или const int в вашем случае).Итак, вам нужно удалить ссылку:

#include <iostream>
#include <type_traits>
#include <vector>

int main() {
    std::vector<int> vec{0};

    for(auto it=vec.begin(); it!=vec.end(); ++it) {
        std::cout << std::is_const<std::remove_reference<decltype(*it)>::type>::value << std::endl;
    }

    for(auto it=vec.cbegin(); it!=vec.cend(); ++it) {
        std::cout << std::is_const<std::remove_reference<decltype(*it)>::type>::value << std::endl;
    }
}

Это дает:

0
1
0 голосов
/ 23 ноября 2018

is_const всегда возвращает false для ссылок.Вместо этого выполните:

std::is_const_v<std::remove_reference_t<decltype(*v.begin() )>> // false
std::is_const_v<std::remove_reference_t<decltype(*v.cbegin())>> // true
0 голосов
/ 23 ноября 2018

Удалите ссылку, чтобы получить ссылочный тип для проверки его константности.Сама ссылка никогда не является константной - хотя ссылки на конст в разговорной речи можно назвать константными ссылками:

std::is_const_v<std::remove_reference_t<decltype(*it)>>
...