1

我正在解析一些文本,如果我可以使用数组是右值而不是在自己的行上定义它,这将使我的生活更轻松。我已经做到了

 int a[]={1,2,3}; //its own line. Do not want

 func([]()->int*{static int a[]={1,2,3}; return a; }()); //It compiles but untested. It doesn't compile with 2003

我试过了

 func(int []={1,2,3}); //but got a compile error bc this is simply illegal

我可以在行尾添加其他内容,但之前不行。你们有什么想法吗?

4

3 回答 3

4
func([]()->int*{int a[]={1,2,3}; return a; }()); //works well on C++0x.

我觉得有趣的评论效果很好。我不是 lambda 律师,但我相信上面的代码将指针返回到局部变量,这是未定义的行为,因此即使编译也并不意味着它是正确的。

至于幕后发生的事情,我的理解是编译器将 lambda 转换为仿函数的方式类似于(请注意,考虑到没有捕获和确切的 lambda,这是一种简化:

struct __lambda {
   // no captures: no constructor needed, no member objects needed
   int* operator()() {        // returns int*, no arguments

      int a[] = { 1, 2, 3 };  // auto variable
      return a;               // return &a[0], address of a local object
   }
};
于 2011-06-06T14:13:22.050 回答
3

我不确定这是您想要的,但您可以执行以下操作:

  for ( int a[3] = {1, 2, 3}; func( a ), false; );

请注意,Microsoft 编译器不支持它,但根据 C++'03 标准它是有效的。

于 2011-06-06T14:11:43.030 回答
0

您在 C++03 中唯一能做的就是将数组封装在结构/类中。然后可以传递整个对象。

于 2011-06-06T14:05:41.530 回答