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

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 特性。

eer*_*ika 5

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

std::is_const_v<std::remove_reference_t<decltype(*it)>>
Run Code Online (Sandbox Code Playgroud)

  • 它要求定义 `template&lt;class T&gt; constexpr bool is_const_ref_v = std::is_const_v&lt;std::remove_reference_t&lt;T&gt;&gt;;`。 (2认同)

ein*_*ica 5

*it将是一个引用而不是被引用的类型(int&const int&而不是intconst 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。