为什么VC ++ 2010允许这个编译?

时间:2012-04-05 19:26:05

标签: c++ visual-c++

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

如果元素类型为const int,则赋值语句不应分配给const int&吗?这不能使用LLVM 3.0进行编译。为什么VC ++允许它?

1 个答案:

答案 0 :(得分:8)

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

标准规定std::vector<T,Allocator>::value_typeAllocator::value_type的typedef。现在,默认分配器(如果没有提供)为std::allocator<T> value_type,根据表28 必须与T 相同。现在,VS2010中标准分配器的实现会从类型参数中删除const限定符,因此std::allocator<const T>::value_typeT,而不是const T

重要的是要注意,编译器不适合接受您自己提供的代码,因为它是未定义的行为,编译器可以随意使用。但另一方面,std::allocator实施中存在不一致性。

您已经自己回答了这个问题:它是未定义的行为。编译器不需要提供诊断,操作的结果可以是任何内容。检测到类型不可分配并提供有意义的错误消息(或不是)

是实现质量的一种情况