我正在使用自定义类型作为模板参数的标准容器(如vector和pair)。大多数情况下,这些模板类型是const限定的,例如:
std::vector<const std::pair<const customType, const double>>
哈希()运算符和比较运算符==和
当我将这些值传递给partial_sort_copy,partial_sort和擦除之类的标准库函数时,就会出现问题。由于某种原因,这些函数最终会尝试对给定的类型进行赋值,最终由于const而导致编译失败。
有什么方法可以将const投射到vector和pair的模板类型上吗?即,将
vector<const myType>
转换为vector<myType>
。提前致谢。
编辑:现在带有冲突的最小示例代码!
// Non-working code:
std::vector<const std::pair<const int, const double>> list{ { 3, 3. }, { 2, 2. }, { 1, 1. }, { 0, 0. } };
std::partial_sort(list.begin(), list.begin() + 2, list.end(), [](const std::pair<const int, const double>& x, const std::pair<const int, const double>& y){ return x.first < y.first; });
// This works, actually:
std::vector<std::pair<int, double>> list{ { 3, 3. }, { 2, 2. }, { 1, 1. }, { 0, 0. } };
std::partial_sort(list.begin(), list.begin() + 2, list.end(), [](const std::pair<int, double>& x, const std::pair<int, double>& y){ return x.first < y.first; });
标准库不喜欢我的代码是什么?
最佳答案
此类const类型的容器是未定义的行为。 std::vector<const T>
使用std::allocator<const T>
作为其分配器类型,并且分配器要求说该值类型必须是非常量对象类型。
甚至无视...
没有。
通常,some_template<T>
和some_template<const T>
是完全不相关的类型,因此您不能在它们之间进行强制转换。与const some_template<T>
和some_template<T>
不同,它们之间没有有效的转换。
因此,您应该停止使用const对象的 vector 。而是使用非const对象的const vector 。
关于c++ - 模板类型参数的C++常数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37027662/