[英]c++, pointers, references, passing from one to another function, std::vector, std::string
我在使用std :: vector和std :: string的指针和引用中有一个特定的问题。 以下代码段中有一些问题,以下是一些问题。
我基本上有这个代码
//first of all: is this function declaration good?
//or shoudl I already pass the std::vector in another way?
//I'm only reading from it
void func(const std::vector<std::string>& vec)
{
//I need to call otherFunc(void*) with a single element from vec:
//otherFunc(void* arg);
//with arg being a void* to vec[0]
}
我的IDE告诉我,只有&*vec[0]
用作otherFunc
参数,但这不能编译...
如何进行此类参数传递的最佳方法?
只要函数不打算修改向量,那是一个很好的声明。 它比按值传递更有效,因为它避免了复制向量-这是需要分配内存的昂贵操作。
但是,另一个函数需要非常量指针。 如何处理此问题取决于它是否可能修改数据。
如果不会(如您所暗示的那样,当您说“我只是从中读取”)时,这些选项为:
otherFunc(void const * arg)
可以更otherFunc(void const * arg)
保证它不会,或者 const_cast<void*>
删除const
限定符 注意&*vec[0]
不会编译; 您希望vec[0].c_str()
获得指向第一个字符串数据的C兼容指针, vec[0].c_str()
是您需vec[0].c_str()
。
如果它可能会修改向量,那么您将不得不做其他事情,因为没有合法的方法可以通过指向其数据的指针来修改std::string
。 最好的选择可能是使用std::vector<char>
而不是std::string
,但这取决于函数的功能。
首先, &*vec[0]
是没有意义的; 您可能的意思是&vec[0]
(即向量中第一个字符串的地址)。
但是即使这样也不会编译,因为&vec[0]
的类型为const std::string *
。 最重要的是,它是const
。 您可以这样做:
otherFunc(const_cast<std::string *>(&vec[0]));
但!!! 在void *
的上下文中尝试使用const std::string *
void *
听起来是一个非常糟糕的主意。 那怎么可能有用呢?
首先,由于您仅从向量中读取数据,因此将其作为const
引用传递是一个好主意,并且应该可以正常工作。
关于第二个问题:很难说otherFunc
将对您的对象做什么,因为它期望一个void
指针。 这是C样式,不应在C ++中使用,这样做有更好的类型安全方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.