C++ char*[] 到 char** 转换

2024-01-03

我有这个简单的代码,编译时没有错误/警告:

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(使用前将#替换为@)

C++ char*[] 到 char** 转换 的相关文章

随机推荐