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作为参数.
我的担忧(/误解)是:
Max*_*kin 10
operator[]具有更高的优先级operator&(后缀运算符具有最高优先级),因此在此处首先进行评估,不需要括号.这里&input[j]和&(input[j])这里没有区别.
替代更简单的语法:
auto selectedVectorPtr = input.data() + j;
Run Code Online (Sandbox Code Playgroud)
std::addressof这里也不需要.
该运算符优先级决定了[]领先前计算&.因此,这两个表达没有区别.
当您想知道片段的安全含义时,需要考虑两个问题&input[j](无论外部括号如何):
std::vector::at而不是将std::vector::operator[]其包装到try- catch块中.T先验未知的地址,operator &可能会超载T.虽然这首先是邪恶的,但你可以std::addressof用来减轻这种可能性.请注意,在您的情况下,这不是必需的,因为您正在获取std::vector实例的地址.