我有这个简单的代码,编译时没有错误/警告:
void f(int&, char**&){}
int main(int argc, char* argv[])
{
f(argc, argv);
return 0;
}
接下来是无法编译的类似代码:
void f(int&, char**&){}
int main()
{
int argc = 2;
char* argv[] = { "", "", nullptr };
f(argc, argv);
//@VS2013 error: cannot convert argument 2 from 'char *[3]' to 'char **&'
//@GCC error: invalid initialization of non-const reference of type 'char**&' from an rvalue of type 'char**'
return 0;
}
Why char*[]
可以转换为char**&
在第一个示例中,无法在第二个示例中转换?编译时大小是否已知有什么关系吗?
编辑:我认为第二种情况需要 2 次转换,并且编译器只能完成一次隐式转换。
这段代码编译得很好:
void f(int&, char**&){}
int main()
{
int argc = 2;
char* temp[] = { "", "", nullptr };
char** argv = temp;
f(argc, argv);
return 0;
}
因为尽管表面看来,第二个论点main
有
类型char**
。当用作函数的声明时
参数,顶级数组被重写为指针,所以char
*[]
事实上,char**
。这只适用于函数
然而参数。
A char*[]
(如你的第二种情况)可以转换为char**
,
但转换的结果(与任何转换一样)是
右值,并且不能用于初始化非常量引用。
你为什么想要参考?如果是修改指针的话,
修改char**
论证main
是未定义的行为
(至少在形式上,在 C 中——我没有检查过 C++ 是否更
这里是自由派)。当然,你不可能
修改数组的常量地址。如果你不想
要修改它,为什么要使用引用?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)