模板类型参数的C ++ constness

问题描述 投票:2回答:1

我使用自定义类型作为模板参数,使用像vector和pair这样的标准容器。大多数情况下,这些模板类型是const限定的,如:

std::vector<const std::pair<const customType, const double>>

Hash()运算符和比较运算符==和<已定义。

当我将这些值传递给标准库函数(如partial_sort_copy,partial_sort和erase)时出现问题。出于某种原因,这些函数最终会尝试对给定类型进行赋值,最终由于consts而在编译时失败。

有没有办法在矢量和对的模板类型上输出consts?即,将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; });

标准库不喜欢我的代码是什么?

c++ templates vector const std-pair
1个回答
4
投票

const类型的这种容器是未定义的行为。 std::vector<const T>使用std::allocator<const T>作为其分配器类型,并且Allocator要求说值类型必须是非const对象类型。

甚至忽略了......

有没有办法在矢量和对的模板类型上输出consts?即,将vector<const myType>施放到vector<myType>

没有。

一般来说,some_template<T>some_template<const T>是完全不相关的类型,所以你不能在它们之间施放。与const some_template<T>some_template<T>不同,他们之间没有有效的转换。

所以你应该停止使用const对象的向量。而是使用非const对象的const向量。

© www.soinside.com 2019 - 2024. All rights reserved.