哪个向量地址更安全?

时间:2018-09-24 11:39:09

标签: c++ pointers vector

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

std::vector<std::vector<T>> input;
auto selectedVectorPtr=&input[j];

比这更安全

std::vector<std::vector<T>> input;
auto selectedVectorPtr=&(input[j]);

还假设输入的作用域直到使用selectedVectorPtr作为参数的函数才结束。

我的担忧(/误解)是:

  • ()是否创建任何临时对象?那么,收录地址不好吗?
  • 类型T上的&或[]运算符重载对更改运算符优先级是否有影响?
  • 获取地址后,如果对向量(或两者)进行大小调整会怎样?

3 个答案:

答案 0 :(得分:10)

operator[] has higher precedence then operator&(后缀运算符具有最高优先级),因此在此首先对其求值,不需要括号。这里的&input[j]&(input[j])之间没有区别。


更简单的语法:

auto selectedVectorPtr = input.data() + j;

这里也不需要std::addressof

答案 1 :(得分:8)

operator precedence指示[]在前&之前被评估。因此,两个表达式没有区别。

您想知道摘要的安全性时,&input[j]有两个要考虑的问题(不管外括号是什么):

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

答案 2 :(得分:0)

&input[j]&(input[j])不会有任何区别。这是因为operator[]的优先级高于operator&

因此,在两种情况下,它的评估结果均为&(input[j])