我正在阅读C++ Primer,在第6.2节中它说:
“参数初始化的工作方式与变量初始化相同。”
但当我这么做的时候
void foo(char* args[]) {return;}
int main() {
char* args[]={"asd","dsa"}; // ok.
foo({"asd","dsa"}); // error.
}为什么会这样呢?
发布于 2015-07-27 00:07:46
正如@T.C.在注释中指出的那样,函数参数中的args被转换为char**,因为函数不能将数组作为参数。既然你做不到
char **asd={"asd","dsa"}; 密码是非法的。我的困惑来自这样一个事实
char* args[]={"asd","dsa"};
char **asd=args;是合法的。
发布于 2015-07-27 00:33:27
通常可以利用新的初始化语法和语义使用匿名数组作为参数,但您必须跳过几个圈。例如
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" });
}但这并不是你最初想要的。
发布于 2015-07-26 23:34:01
为什么会这样呢?
首先,在这两种情况下,您都需要char const*,因为您使用的是字符串文本。
其次,如果参数类型是数组,则{...}可以工作,但是char*[]被调整为char** (由于衰变),而char**不能用大括号内的列表初始化。
或者使用std::string和std::vector,就像您应该做的那样:
void foo(std::vector<std::string> args) {return;}以及:
foo({"asd","dsa"});威尔工作得很好。
https://stackoverflow.com/questions/31642993
复制相似问题