std::vector<const int> vci;
vci.push_back(1);
vci[0] = 2;
如果元素类型为const int
,则赋值语句不应分配给const int&
吗?这不能使用LLVM 3.0进行编译。为什么VC ++允许它?
答案 0 :(得分:8)
虽然它是未定义的行为,并且基本上任何可能发生,包括你所看到的,我已经跟踪了这似乎是库与标准的不兼容性。特别是VS2010库中定义的标准分配器不符合标准。
标准规定std::vector<T,Allocator>::value_type
是Allocator::value_type
的typedef。现在,默认分配器(如果没有提供)为std::allocator<T>
value_type
,根据表28 必须与T 相同。现在,VS2010中标准分配器的实现会从类型参数中删除const
限定符,因此std::allocator<const T>::value_type
为T
,而不是const T
。
重要的是要注意,编译器不适合接受您自己提供的代码,因为它是未定义的行为,编译器可以随意使用。但另一方面,std::allocator
实施中存在不一致性。
您已经自己回答了这个问题:它是未定义的行为。编译器不需要提供诊断,操作的结果可以是任何内容。检测到类型不可分配并提供有意义的错误消息(或不是)