【问题标题】:Precendence rules and lambda expressions优先规则和 lambda 表达式
【发布时间】:2011-10-22 10:48:28
【问题描述】:

我试图了解 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 支持突然触发 警告。

我的问题是,[2b] 在 C++0x 中实际上会做什么?什么是 与在 gcc-4.5.1 中看起来很好的[1b] 的区别?是[2b] 在做 用 gcc-4.3.2 和 C++03 做对了吗?

PS。我知道 STL 容器。

【问题讨论】:

  • PPS。欢迎提出更好标题的建议。
  • 非常有趣,我不知道你甚至可以 1b和2b。对我来说,它看起来像是一个不完整的放置语法......这是否有效?
  • @Kerrek:我对标准的模糊理解是 int*[10] 命名了一个类型,以便 [1b][2b] 中的括号不添加任何内容。
  • @sehe:谢谢。这很有用。

标签: gcc lambda c++11


【解决方案1】:

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

另见

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

编辑:测试的确切版本

  • gcc 版本 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 版本 4.6.1 20110604 (prerelease) (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 没有任何区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多