【发布时间】:2021-01-11 00:00:34
【问题描述】:
我正在尝试使用概念,以便能够检测给定类型的开始函数是否将迭代器返回到“const T&”或仅返回“T&”。但我不确定如何最好地去做,我尝试了以下方法:
#include <iostream>
#include <concepts>
#include <vector>
#include <set>
template <typename T>
concept IsConst = std::is_const<T>::value;
template<typename T>
concept IsIterableOfConst = requires (T& t) { { *t.begin() } -> IsConst; };
template <IsIterableOfConst T>
void test()
{
std::cout << "Yes" << std::endl;
}
template <typename T>
void test()
{
std::cout << "No" << std::endl;
}
int main(int argc, char** argv)
{
test<std::set<int>>();
test<std::vector<int>>();
}
当我希望它产生输出“Yes No”时,这会产生输出“No No”,因为据我所知,std::set 中的迭代器应该总是迭代设置持有类型。如何正确检测容器包含 const 值?
【问题讨论】:
-
"如何正确检测容器包含 const 值?" 我不知道为什么问一个范围是有用的。如果您要约束的函数不会对元素进行任何修改,那么它为什么要关心范围是否为 const 呢?毕竟,如果您有非常量左值,则仍然可以调用以
const &为参数的函数。为什么范围不应该是这样的?
标签: c++ c++20 c++-concepts