我可以成功地对 char 字符串数组进行初始化列表的 C 转换,但似乎无法使其与 C++ 转换 (static_cast) 一起使用:
int main()
{
char x[] = "test 123";
// This works fine:
char **foo = (char *[]) { "a", x, "abc" };
std::cout << "[0]: " << foo[0] << " [1]: " << foo[1]
<< " [2]: " << foo[2] << std::endl;
// This will not compile ("expected primary-expression before '{' token"):
//char **bar = static_cast<char *[]>( { "a", x, "abc" } );
//std::cout << "[0]: " << bar[0] << " [1]: " << bar[1]
// << " [2]: " << bar[2] << std::endl;
}
这里可以使用 C++ 强制转换吗?如果是这样,正确的语法是什么?如果不是,为什么不呢?C 演员是否让我做了一些我不应该做的事情?
最终,我问这个问题的原因是我正在调用一个以 char 数组指针作为参数的函数,并且我想使用匿名数组作为调用参数。
我正在使用海湾合作委员会4.4.6。
我可以成功地对 char 字符串数组进行初始化列表的 C 转换
不,你不能。您根本没有使用初始化列表或 C 强制转换。您使用的是复合文字。这是 C 语言的特性,C++ 中不存在。一些编译器确实支持 C++ 作为语言扩展。
我强烈建议您使用编译器选项,该选项至少会在您使用非标准功能时发出警告,以避免出现这样的混乱。
但似乎无法让它与 C++ 强制转换一起使用
您无法转换初始值设定项列表表达式。您必须正常初始化一个命名数组,然后初始化指针 - 尽管您几乎不需要真正需要一个单独的指针变量,因为无论如何在大多数上下文中数组都会隐式衰减为指针。
const char* arr[] = { "a", x, "abc" };
const char** foo = arr;
我问这个问题的原因是我正在调用一个以 char 数组指针作为参数的函数,并且我想使用匿名数组作为调用参数。
如果您可以修改该函数,那么有一些方法可以允许在没有命名数组的情况下进行调用。你可以接受std::initializer_list
,或者可以从初始化列表构造的类型,例如实例std::array
.
附言。从字符串文字隐式转换为char*
C++ 中也不允许 - 但某些编译器允许作为语言扩展。使用const char*
here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)