优先规则和lambda表达式

时间:2011-08-08 14:21:12

标签: gcc lambda c++11

我试图了解gcc-4.3.2和。的警告差异 GCC-4.5.1。

鉴于

struct S { };

int main() {
  int** i;
  i = new  int*[10] ; delete[] i; // [1a]
  i = new (int*[10]); delete[] i; // [1b]

  S** s;
  s = new  S*[10];   // [2a] fine
  s = new (S*[10]); // [2b] warning: lambda expressions only available with -std=c++0x or -std=gnu++0x
}

我了解[1a][2a]正确初始化动态数组 指针未初始化的指针。

我们的代码库中有[2b]的实例,其中有人真正需要 [2a]。随着gcc-4.5.1 [2b]中更好的C ++ 0x支持突然触发a 警告。

我的问题是,[2b]在C ++ 0x中实际会做什么?什么是 差异为[1b],在gcc-4.5.1中看起来不错?是[2b]做了 gcc-4.3.2和C ++ 03是否正确?

PS。我知道STL容器。

1 个答案:

答案 0 :(得分:2)

警告是一个错误:表达式不能被误认为是lambda表达式;它会用--std = c ++ 0x定义来做同样的事情。

另见

我用gcc v 4.3,4.4,4.5和4.6进行了测试。只有4.5给出了流氓警告,4.6愉快地编译代码而没有投诉。

编辑:测试的确切版本

  • gcc version 4.3.5(Ubuntu 4.3.5-3ubuntu1)
  • gcc版本4.4.5(Ubuntu / Linaro 4.4.4-14ubuntu5)
  • gcc版本4.5.1(Ubuntu / Linaro 4.5.1-7ubuntu2)警告
  • gcc version 4.6.1 20110604(预发布)(Debian 4.6.0-11)

更新我刚刚证明4.5.1编译器(以及所有其他版本)的编译输出完全相同,无论您是否指定--std=c++0x执行命令行

g++ -o 5-0x.s --std=c++0x -S test.cpp
g++ -o 5.s    -S             test.cpp

比较5-0x.s5.s显示没有任何区别。