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

Tab*_*r33 5 c++ visual-c++

std::vector<const int> vci;
vci.push_back(1);
vci[0] = 2;
Run Code Online (Sandbox Code Playgroud)

对于元素类型const int,不应该将赋值语句分配给const int&?这不能使用LLVM 3.0进行编译.为什么VC++允许它?

Dav*_*eas 8

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

标准规定这std::vector<T,Allocator>::value_type是一个typedef Allocator::value_type.现在默认分配器(如果提供无)是std::allocator<T>对于其中value_type,根据表28必须是相同的至T.现在,VS2010中标准分配器的实现const从类型参数中删除了限定符,因此std::allocator<const T>::value_typeT,而不是const T.

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

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

  • @ Tabber33:如果只能在已经未定义的行为的代码中看到差异,那么它不会影响代码与标准的一致性,它会变成QoI. (2认同)