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

时间:2015-07-26 23:27:14

标签: c++ function

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

  

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

然而,当我这样做时:

void foo(char* args[]) {return;}

int main() {

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

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

}

为什么?

4 个答案:

答案 0 :(得分:4)

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

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

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

这一事实
char* args[]={"asd","dsa"};
char **asd=args;

是合法的。

答案 1 :(得分:3)

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

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" });
}

但这并不是你原本想到的。

答案 2 :(得分:0)

  

为什么?

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

其次,如果参数类型是数组,{...}可以正常工作,但char*[] 已调整char**(由于还款),无法初始化使用 braced-init-list

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

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

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

work just fine

答案 3 :(得分:0)

  

&#34;参数初始化的工作方式与变量初始化相同。&#34;

就调用构造函数而言,这是正确的,我认为它们的意思。但是,初始值设定项是特殊的,与普通值表达式不同,您可以将它们分配给变量或传递给函数调用。

C / C ++没有办法编写文字匿名数组。您只能在声明变量时将其作为初始化程序。