我可以成功为一个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数组指针作为参数,我想使用匿名数组作为调用参数。
我正在使用GCC 4.4.6。
答案 0 :(得分:3)
不,你不能。您根本没有使用初始化列表也不使用C cast。你使用的是复合文字。它是C语言中不存在的C语言特性。有些编译器确实在C ++中支持它们作为语言扩展。我可以成功为char字符串数组
执行初始化列表的C强制转换
我强烈建议您使用编译器选项,至少在使用非标准功能时会发出警告,以避免这样的混淆。
但似乎无法使用C ++强制转换
您无法转换初始值设定项列表表达式。你必须正常初始化一个命名数组,然后是指针 - 虽然你几乎不需要一个单独的指针变量,因为无论如何数组都隐式地衰减到一个指针。
const char* arr[] = { "a", x, "abc" };
const char** foo = arr;
我问这个的原因是我正在调用一个具有char数组指针作为参数的函数,我想使用匿名数组作为调用参数。
如果您可以修改该功能,那么有一些方法可以允许没有命名数组的调用。您可以接受std::initializer_list
或可以从初始化列表构建的类型,例如std::array
的实例。
PS。 C ++中也不允许从字符串文字到char*
的隐式转换 - 但某些编译器允许将其作为语言扩展。在这里使用const char*
。