转换匿名数组初始化列表

时间:2016-10-24 04:04:05

标签: arrays c++11 casting initializer-list

我可以成功为一个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。

1 个答案:

答案 0 :(得分:3)

  

我可以成功为char字符串数组

执行初始化列表的C强制转换
不,你不能。您根本没有使用初始化列表也不使用C cast。你使用的是复合文字。它是C语言中不存在的C语言特性。有些编译器确实在C ++中支持它们作为语言扩展。

我强烈建议您使用编译器选项,至少在使用非标准功能时会发出警告,以避免这样的混淆。

  

但似乎无法使用C ++强制转换

您无法转换初始值设定项列表表达式。你必须正常初始化一个命名数组,然后是指针 - 虽然你几乎不需要一个单独的指针变量,因为无论如何数组都隐式地衰减到一个指针。

const char* arr[] = { "a", x, "abc" };
const char** foo = arr;
  

我问这个的原因是我正在调用一个具有char数组指针作为参数的函数,我想使用匿名数组作为调用参数。

如果您可以修改该功能,那么有一些方法可以允许没有命名数组的调用。您可以接受std::initializer_list或可以从初始化列表构建的类型,例如std::array的实例。

PS。 C ++中也不允许从字符串文字到char*的隐式转换 - 但某些编译器允许将其作为语言扩展。在这里使用const char*