【发布时间】:2019-09-22 11:31:52
【问题描述】:
以下程序是否有未定义的行为?
#include <iostream>
#include <vector>
struct Foo
{
const std::vector<int> x;
};
int main()
{
std::vector<int> v = {1,2,3};
auto f = new Foo{v};
const_cast<int&>(f->x[1]) = 42; // Legal?
std::cout << f->x[1] << "\n";
}
请注意,它不是使用const_cast 从f->x 中剥离常量,而是从f->x[x] 中剥离常量,这可能由一个单独的数组表示。还是允许翻译假定f->x[1] 在创建后是不可变的?
【问题讨论】:
-
结构没有区别,问题与
int main() { const std::vector<int> y(1); (int&)y[0] = 42; }相同 -
如果您编写自己的类是 std::vector 的精确克隆,我非常有信心该代码是合法的。有时该标准有额外的条款说标准库容器具有特殊属性(例如,不完整类型的 std::vector 导致 UB);但是在这种情况下我找不到任何相关的东西。
-
如果你有一个库分发
const std::vector<int> &s,那么请注意库没有假设ints 不会改变,即使编译器不能假设。
标签: c++ stl language-lawyer stdvector const-cast