标准::矢量<T>::value_type的正确行为
Correct behaviour for std::vector<T>::value_type
在对一些使用std::vector::value_type
的模板代码中的一些错误感到挠头之后,我将其跟踪到以下内容。这是根据标准的正确行为,还是MSVC 2012 CTP的问题?
typedef std::vector<int>::value_type t1;
typedef std::vector<int const>::value_type t2;
static_assert(!std::is_same<t1, t2>::value, "hmmm");
以上断言失败
std::vector<T>
的value_type
为T
(§23.3.6.1)。
is_same
的值考虑了cv限定符(§20.9.6)。
在您的情况下,这意味着检查std::is_same<int, int const>
,这应该失败。
这反过来意味着你观察到的行为根据标准是错误的。MSVC似乎正在删除value_type:
的cv限定符。std::vector<const int>::value_type val = 5;
val = 10;
在MSVC2008上可以编译,但在gcc 4.4上无法编译。
你应该向微软提交一份bug报告。
编辑: Nawaz上面的评论让我思考。根据这个问题const int
确实是不允许作为一个value_type在c++ 03!似乎在c++ 11中。虽然在c++ 11中没有明确禁止vector,但在分配器中是禁止的(§17.6.3.5),这反过来又使得vector也是非法的。
无论如何,MSVC静默删除const
的行为在这里似乎是错误的。
例如,GCC 4.7.2在到达static_assert
之前就无法编译OP代码。
问题是标准容器(例如std::vector
)没有设计成容纳const T
,因为它们依赖于分配器和[allocator]中的标准。只定义了非const、非引用对象类型的分配器行为。
据我所知,这意味着使用std::vector<const int>
产生未定义的行为。因此,两个编译器都是正确的!
请参阅这个问题,这个答案和Howard Hinnant对此的评论,我引用了第一句话:
底线:我们没有设计容器来容纳
const T
。
看来std::vector<const int>
是不允许的:按照标准T应该是CopyInsertable
, const int
不是。
参见序列容器要求, 23.2.3序列容器[Sequence。
OP代码无法在
行同时使用gcc 4.7和icc 13.0进行编译 typedef std::vector<int const>::value_type t2;
显然,MSVC丢弃了const限定符
- EASTL矢量<向量<int>>连续的
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- 如何解决"'mutex' in namespace 'std' does not name a type"?