假设一个函数需要一个指向类型T的向量的指针,但是当我只有一个类型T的向量的向量时(类型不能保证是POD),是这个
std::vector<std::vector<T>> input;
auto selectedVectorPtr=&input[j];
比这更安全
std::vector<std::vector<T>> input;
auto selectedVectorPtr=&(input[j]);
还假设输入的作用域直到使用selectedVectorPtr
作为参数的函数才结束。
我的担忧(/误解)是:
答案 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])