Fla*_*lau 5 c++ iterator reference constants type-traits
我正在为我的迭代器类型编写一个测试,并想检查由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;
}
Run Code Online (Sandbox Code Playgroud)
但这0
两种情况都会打印出来。
有没有办法检查引用是否为常量?
我可以使用 C++11/14/17 特性。
删除引用以获取引用类型以检查其常量性。引用本身永远不会是 const - 即使对 const 的引用通俗地称为 const 引用:
std::is_const_v<std::remove_reference_t<decltype(*it)>>
Run Code Online (Sandbox Code Playgroud)
*it
将是一个引用而不是被引用的类型(int&
或const int&
而不是int
或const int
在您的情况下)。因此,您需要删除引用:
#include <iostream>
#include <type_traits>
#include <vector>
int main() {
std::vector<int> vec{0};
std::cout << std::is_const<std::remove_reference<decltype(*vec.begin())>::type>::value << std::endl;
std::cout << std::is_const<std::remove_reference<decltype(*vec.cbegin())>::type>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这产生:
0
1
Run Code Online (Sandbox Code Playgroud)
注意:以上作品使用 C++11。@eerorika 的回答更简洁,但需要 C++17。