C++char*[]到char**的转换
C++ char*[] to char** conversion
我有一个简单的代码,编译时没有错误/警告:
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;
}
为什么char*[]
在第一个样本中可以转换为char**&
,而在第二个样本中不能转换?在编译时是否知道大小有关系吗?
编辑:我认为第二种情况需要两个转换,编译器只能完成一个隐式转换。
此代码编译良好:
void f(int&, char**&){}
int main()
{
int argc = 2;
char* temp[] = { "", "", nullptr };
char** argv = temp;
f(argc, argv);
return 0;
}
因为尽管出现了,main
的第二个参数类型CCD_ 4。用作函数的声明时参数,顶级数组被重写为指针,所以char
*[]
实际上就是char**
。这仅适用于函数然而,参数。
CCD_ 7(如第二种情况)可以转换为CCD_,但是转换的结果(与任何转换一样)是rvvalue,并且不能用于初始化非常量引用。你为什么想要推荐信?如果要修改指针,将char**
参数修改为main
是未定义的行为(从形式上讲,至少在C中,我没有检查C++是否更这里是自由主义者)。当然,你不可能修改数组的常量地址。如果你不想要修改它,为什么要使用引用?
4.2数组到指针的转换[conv.Array]
类型为"N T的数组"或"T的未知界的数组"的左值或右值可以转换到类型为"pointer to T"的prvalue。结果是指向数组的第一个元素。
prvalue是:
prvalue("纯"右值)是一个标识临时对象(或其子对象)或是与任何对象
不能将非常数引用绑定到临时引用。
int& i = int(); // error
char* argv[] = { "", "", nullptr };
// the result of the conversion is a prvalue
char**& test = argv; // error
因此,以下代码将愉快地编译:
#include <iostream>
void f(int& argc, char** const& argv){
std::cout << argv[0] << std::endl; // a
}
int main()
{
int argc = 2;
char* argv[] = { "a", "b", nullptr };
f(argc, argv);
return 0;
}
Kanze的评论中指出了一件我忽略了的重要事情。
在OP中提供的第一示例中,char* argv[]
和char** argv
是等效的。因此,没有转换。
std::cout << std::is_array<decltype(argv)>::value << std::endl; // false
std::cout << std::is_array<char**>::value << std::endl; // false
std::cout << std::is_array<char*[]>::value << std::endl; // true
std::cout << std::is_same<decltype(argv), char**>::value << std::endl; // true
std::cout << std::is_same<decltype(argv), char*[]>::value << std::endl; // false
中temp
的类型
char* temp[] = { "", "", nullptr };
是而不是char*[],它是
char*[3]
后者不能隐式转换为"char**"。
在main
中,argv
的类型是未绑定的char*
阵列,其等效于char**
我承认,这很令人困惑:)
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;