我正在为自己的迭代器类型编写测试,并希望检查通过取消引用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功能。
答案 0 :(得分:4)
删除引用以获取引用类型以检查其常量性。引用本身永远不是const-即使对const的引用可能通俗地称为const引用:
std::is_const_v<std::remove_reference_t<decltype(*it)>>
答案 1 :(得分:4)
*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
答案 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;
}