为什么我不能用 foo(char* args[]) 做 foo({ "asd" , "asd1" })?
Why can't I do foo({"asd","asd1"}) with foo(char* args[])?
我正在阅读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::string
和std::vector
,因为你已经应该这样做了:
void foo(std::vector<std::string> args) {return;}
:
foo({"asd","dsa"});
相关文章:
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 反转C++ foo(MyClass &) vs foo(const MyClass &)
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何实现这个函数 foo.getSize().x.
- Clearing Class Foo with new(pFoo) Foo()
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 使用 G++ 编译时"Undefined Refrence to Foo"
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- foo(void) vs foo(void *)
- 没有用于调用 foo 的匹配函数
- 两种初始化有什么区别:Foo f();Foo f = Foo()
- 有没有办法删除传递给函数"foo(新对象())"的对象?
- std::size_t 还是 std::vector<Foo>::size_type?
- 引用函数如何"int &foo();"工作?
- 为什么int foo()是右值,而int&foo()在这个例子中是左值?
- <<找不到运算符,尽管定义了 Foo 类型的右操作数,但该运算符仍采用类型为 Foo 的右侧操作数
- 为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"
- 为什么即使"a.foo<0>();"就足够了,"a.template foo<0>();"也允许?
- 为什么我不能用 foo(char* args[]) 做 foo({ "asd" , "asd1" })?