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

Why can't I do foo({"asd","asd1"}) with foo(char* args[])?

本文关键字:foo asd asd1 不能 char 为什么 args      更新时间:2023-10-16

我正在阅读c++入门,第6.2节说:

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

然而当我这样做的时候:

void foo(char* args[]) {return;}
int main() {
char* args[]={"asd","dsa"};  // ok.
foo({"asd","dsa"});          // error.
}

为什么?

在注释中指出,函数参数中的args被转换为char**,因为函数不能将数组作为参数。既然你不能做

char **asd={"asd","dsa"}; 

代码是非法的。我的困惑来自于

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

是合法的。

通常可以利用新的初始化语法和语义来使用匿名数组作为参数,但是您将不得不跳过一些障碍。例如

typedef const char *CC2[2];
void foo(const CC2 &a) {}
int main() {
  foo({ "asd", "dsa" });
}

但是,在您的情况下,这种技术没有帮助,因为您正在请求对临时数组进行数组到指针的转换。这在c++中是非法的。

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

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

template <size_t N> void foo(const char *const (&args)[N]) {}
int main() {
  foo({ "asd", "dsa" });
}

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

就调用构造函数而言,我认为它们的意思是。然而,初始化式是特殊的,它不同于普通的值表达式,可以赋值给变量或传递给函数调用。

C/c++没有写字面匿名数组的方法。

为什么?

首先,在这两种情况下,您都需要char const*,因为您正在使用字符串字面值。

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


或者使用std::stringstd::vector,因为你已经应该这样做了:

void foo(std::vector<std::string> args) {return;}

:

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