如何检查引用是否为常量?

时间:2018-11-23 10:07:29

标签: c++ reference iterator const typetraits

我正在为自己的迭代器类型编写测试,并希望检查通过取消引用begin()cbegin()提供的迭代器返回的引用分别是非const和const。

我尝试做类似以下的事情:-

#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 :(得分:4)

删除引用以获取引用类型以检查其常量性。引用本身永远不是const-即使对const的引用可能通俗地称为const引用:

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

答案 1 :(得分:4)

*it将是引用而不是引用的类型(在您的情况下,是int&const int&而不是intconst 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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可以在此处查看文档注释: https://en.cppreference.com/w/cpp/types/is_const

  • 注释
  

如果T是引用类型,则is_const :: value始终为false。的   检查潜在引用类型的一致性的正确方法是   删除引用: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;
}