我正在阅读C ++ Primer,在第6.2节中它说:
"参数初始化的工作方式与变量相同 。初始化"
然而,当我这样做时:
void foo(char* args[]) {return;}
int main() {
char* args[]={"asd","dsa"}; // ok.
foo({"asd","dsa"}); // error.
}
为什么?
答案 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::string
和std::vector
,因为您已经应该这样做:
void foo(std::vector<std::string> args) {return;}
和
foo({"asd","dsa"});
答案 3 :(得分:0)
&#34;参数初始化的工作方式与变量初始化相同。&#34;
就调用构造函数而言,这是正确的,我认为它们的意思。但是,初始值设定项是特殊的,与普通值表达式不同,您可以将它们分配给变量或传递给函数调用。
C / C ++没有办法编写文字匿名数组。您只能在声明变量时将其作为初始化程序。