5
std::vector<const int> vci;
vci.push_back(1);
vci[0] = 2;

元素类型为const int时,赋值语句不应该分配给 aconst int&吗?这不能与 LLVM 3.0 一起编译。为什么 VC++ 允许它?

4

1 回答 1

8

虽然它是未定义的行为并且基本上任何事情都可能发生,包括您所看到的,但我已经跟踪到这似乎是库与标准的不兼容。特别是 VS2010 库中定义的标准分配器不符合标准。

标准规定这std::vector<T,Allocator>::value_type是一个 typedef 到Allocator::value_type. 现在默认分配器(如果没有提供)是std::allocator<T>for which value_type,根据表 28必须与 T 相同。现在在 VS2010 中标准分配器的实现const从类型参数中删除了限定符,所以std::allocator<const T>::value_typeisT和 not const T

重要的是要注意,编译器本身并不会不符合接受您提供的代码,因为它是未定义的行为,编译器可以随意做。但另一方面,在std::allocator执行中存在不符合项。

您自己已经回答了这个问题:它是Undefined Behavior。编译器不需要提供诊断,操作的结果可以是任何东西。检测到类型不可分配并提供有意义的错误消息(或不提供)是实现质量的一个案例

于 2012-04-05T19:31:13.837 回答