首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能对foo(char* args[])做foo({"asd","asd1"})?

为什么我不能对foo(char* args[])做foo({"asd","asd1"})?
EN

Stack Overflow用户
提问于 2015-07-26 23:27:14
回答 4查看 690关注 0票数 9

我正在阅读C++ Primer,在第6.2节中它说:

“参数初始化的工作方式与变量初始化相同。”

但当我这么做的时候

代码语言:javascript
复制
void foo(char* args[]) {return;}

int main() {

char* args[]={"asd","dsa"};  // ok.

foo({"asd","dsa"});          // error.

}

为什么会这样呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-27 00:07:46

正如@T.C.在注释中指出的那样,函数参数中的args被转换为char**,因为函数不能将数组作为参数。既然你做不到

代码语言:javascript
复制
char **asd={"asd","dsa"}; 

密码是非法的。我的困惑来自这样一个事实

代码语言:javascript
复制
char* args[]={"asd","dsa"};
char **asd=args;

是合法的。

票数 4
EN

Stack Overflow用户

发布于 2015-07-27 00:33:27

通常可以利用新的初始化语法和语义使用匿名数组作为参数,但您必须跳过几个圈。例如

代码语言:javascript
复制
typedef const char *CC2[2];

void foo(const CC2 &a) {}

int main() {
  foo({ "asd", "dsa" });
}

但是,在您的示例中,这种技术不会有帮助,因为您请求的是临时数组上的数组到指针的转换。这在C++是非法的。

代码语言:javascript
复制
typedef int A[2];

const A &r = A{ 1, 2 }; // reference binding is OK
int *p = A{ 1, 2 };     // ERROR: taking address is not OK

所以,如果你真的想做这样的事情,你可以做下面的事情

代码语言:javascript
复制
template <size_t N> void foo(const char *const (&args)[N]) {}

int main() {
  foo({ "asd", "dsa" });
}

但这并不是你最初想要的。

票数 3
EN

Stack Overflow用户

发布于 2015-07-26 23:34:01

为什么会这样呢?

首先,在这两种情况下,您都需要char const*,因为您使用的是字符串文本。

其次,如果参数类型是数组,则{...}可以工作,但是char*[]被调整为char** (由于衰变),而char**不能用大括号内的列表初始化。

或者使用std::stringstd::vector,就像您应该做的那样:

代码语言:javascript
复制
void foo(std::vector<std::string> args) {return;}

以及:

代码语言:javascript
复制
foo({"asd","dsa"});

威尔工作得很好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31642993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档