转换匿名数组初始值设定项列表

Casting an anonymous array 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。

I can successfully do a C cast of an initializer list for an array of char strings

不,你不能。您根本没有使用初始值设定项列表或 C 类型转换。您使用的是复合文字。它是 C++ 中不存在的 C 语言功能。一些编译器在 C++ 中支持它们作为语言扩展。

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

but can't seem to get it to work with a C++ cast

您不能转换初始化列表表达式。您将必须正常初始化一个命名数组,然后是指针——尽管您几乎不需要一个单独的指针变量,因为无论如何在大多数情况下数组都会隐式衰减为一个指针。

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

the reason I'm asking this is that I am calling a function that has a char array pointer as a parameter, and I would like to use an anonymous array as the calling argument.

如果您可以修改该函数,则有一些方法可以在没有命名数组的情况下允许调用。您可以接受 std::initializer_list,或者可以从初始化列表构造的类型,例如 std::array.

的实例

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