gpt4 book ai didi

c++ - 为什么 VC++ 2010 允许编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:34 25 4
gpt4 key购买 nike

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

如果元素类型是const int,赋值语句不应该赋值给const int&吗?这不会用 LLVM 3.0 编译。为什么 VC++ 允许它?

最佳答案

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

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

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

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

关于c++ - 为什么 VC++ 2010 允许编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10034768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com