哪个矢量地址更安全?

hus*_*sik 4 c++ pointers vector

假设一个函数需要一个指向类型为T的向量的指针,但是当我只有一个类型为T的向量向量(类型不能保证是POD)时,这是

std::vector<std::vector<T>> input;
auto selectedVectorPtr=&input[j];
Run Code Online (Sandbox Code Playgroud)

比这更安全

std::vector<std::vector<T>> input;
auto selectedVectorPtr=&(input[j]);
Run Code Online (Sandbox Code Playgroud)

还假设输入的范围不会结束,直到该函数selectedVectorPtr作为参数.

我的担忧(/误解)是:

  • does()创建任何临时对象?那么接受它的地址是不是很糟糕?
  • 操作符重载&或类型T上的操作是否会影响更改操作符优先级的优先级?
  • 如果在获取地址后调整矢量(或两者)的大小,该怎么办?

Max*_*kin 10

operator[]具有更高的优先级operator&(后缀运算符具有最高优先级),因此在此处首先进行评估,不需要括号.这里&input[j]&(input[j])这里没有区别.


替代更简单的语法:

auto selectedVectorPtr = input.data() + j;
Run Code Online (Sandbox Code Playgroud)

std::addressof这里也不需要.


lub*_*bgr 8

运算符优先级决定了[]领先前计算&.因此,这两个表达没有区别.

当您想知道片段的安全含义时,需要考虑两个问题&input[j](无论外部括号如何):

  • 索引可能超出范围,导致未定义的行为.您可能希望使用(可能抛出但更安全)std::vector::at而不是将std::vector::operator[]其包装到try- catch块中.
  • 如果你想获取T先验未知的地址,operator &可能会超载T.虽然这首先是邪恶的,但你可以std::addressof用来减轻这种可能性.请注意,在您的情况下,这不是必需的,因为您正在获取std::vector实例的地址.