我们可以在即将到来的c ++ 0x标准下通过这种语法将数组作为参数传递给函数吗?

Poo*_*ria 11 c++ arrays syntax function c++11

假设我们有以下功能:

void someFunction(int * araye){
 for (int i=0;i<5;i++)
  cout <<araye[i]<<' ';
 cout <<'\n';
}
Run Code Online (Sandbox Code Playgroud)

在即将到来的c ++ 0x标准下,我们可以通过以下语法将数组传递给此函数吗?:

someFunction({1,2,3,4,5});
Run Code Online (Sandbox Code Playgroud)

如果这是真的,我们甚至可以在任何情况下使用这种语法,其中数组元素来自如下的POD类型:

class Test{
 int adad1;
 int adad2;
};
void someFunction(Test * araye){
 for (int i=0;i<3;i++)
  cout <<araye[i].adad1<<'-'<<araye[i].adad2<<' ';
 cout <<'\n';
}
someFunction({{1,2},{3,4},{5,6}});
Run Code Online (Sandbox Code Playgroud)

编辑 - >之后人们说:
所以你们告诉大括号之间的表达式基本上会被视为一个初始化器列表,并建议使用一个额外的函数将指针拉出初始化列表并将其传递给预期的函数,但是这个方法在我看来像是一个hack,能够使用我的预期函数与该表达式作为参数,据说我认为我不应该使用该表达式作为参数,当我的预期函数参数是单个指针时,或者可能有另一种方法来使用该表达式?.

Cub*_*bbi 5

表达式的类型{1,2,3,4,5}std::initializer_list<int>.这是其具有的成员函数的对象size(),begin(),end(),但没有operator[](每18.9/1对的C++ 0x FCD的)

如果你的函数使用std :: vector或任何其他标准容器,这将起作用,因为容器可以从initializer_lists构造(它们都提供了非显式的构造函数):

void someFunction(std::vector<int> araye)
{
         for (int i=0;i<5;i++)
                   std::cout << araye[i] <<' ';
         std::cout <<'\n';
}
int main()
{
        someFunction({1,2,3,4,5});
}
Run Code Online (Sandbox Code Playgroud)

如果你想拥有一个带指针的函数,你需要以某种方式手动将initializer_list转换为你可以以这种方式访问​​的东西:

void someFunction(int* araye)
{
         for (int i=0;i<5;i++)
                   std::cout << araye[i] <<' ';
         std::cout <<'\n';
}
void someFunction(std::vector<int> v)
{
        someFunction(&v[0]);
}
int main()
{
        someFunction({1,2,3,4,5});
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*our 4

如果您的函数采用const int*,而不是int*,那么您只需要一个小的蹦床函数即可将指针从std::initializer_list<int>大括号初始化程序生成的中拉出。像这样的东西(可能;我没有 C++0x 编译器来测试)

void someFunction(const int * array){
    for (int i=0; i<5; i++)
        std::cout << array[i] << ' ';
    std::cout << '\n';
}

void someFunction(const std::initializer_list<int>& init) {
    someFunction(init.begin());
}

someFunction({1,2,3,4,5});
Run Code Online (Sandbox Code Playgroud)

如果您的函数需要知道数组的结尾或大小(通常是这种情况),则将 或init.end()作为init.size()第二个参数传递。