【问题标题】:Is _1 part of C++0x?_1 是 C++0x 的一部分吗?
【发布时间】:2010-10-24 18:56:13
【问题描述】:

我已经看到 two 最近的 answers 使用 _1 作为纯 C++0x 解决方案(没有明确提及 boost lambdas)。

有没有像std::_1 这样的动物,我认为拥有原生 lambda 会使这样的构造变得多余。

std::_1 的Google 代码搜索会从同一项目中找到two results,因此尚无定论。

【问题讨论】:

  • 你认为它们会在命名空间 std 中吗?在提升中,它们位于全局命名空间中......
  • MSDN_1 命名空间中有 std::placeholders ,并且您的两个链接答案也都提到了这一点。这也不是决定性的,但如果没有其他问题,您可能正在寻找错误的东西。
  • 哦,刚刚发现他们在TR1

标签: c++ boost lambda c++11


【解决方案1】:

是的,它们是 std::placeholders 命名空间内 C++0x 的一部分,来自最新草案 (n3126) §20.8.10.1.3 “占位符”:

namespace std {
   namespace placeholders {
      // M is the implementation-defined number of placeholders
      extern unspecified _1;
      extern unspecified _2;
        .
        .
        .
      extern unspecified _M;
   }
}

它们实际上是 included in TR1 (n1836 §3.6.4; n1455) 和 bind,它们取自 Boost.Bind library

【讨论】:

    【解决方案2】:

    是的,它们是 C++0x 的一部分。我没有仔细检查 TR1 规范,但我怀疑它们是在那里添加的(TR1 本质上是 C++03 的一个仅限库的扩展,所以它不能依赖 lambdas),然后,因为它已经在那里在 TR1 中,在 C++0x 中再次删除它会造成不必要的破坏,即使一旦你拥有真正的 lambda 就不再需要它。

    【讨论】:

    • 占位符仍然是必要的,因为 C++0x lambda 不是多态的。
    • 它们在 中。他们添加了绑定和其他东西。
    【解决方案3】:

    显然它们是 C++ 0x 的一部分,应该在符合编译器的 <functional> 标头中定义,请参阅以下常见问题解答:

    C++ 0x FAQ

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 2011-02-20
      • 2016-07-29
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多