【问题标题】:Why start with std::placeholders::_1 instead of _0?为什么从 std::placeholders::_1 而不是 _0 开始?
【发布时间】:2013-02-25 23:27:32
【问题描述】:

c++ 中的大多数内容都是 0,而不是基于 1。只是出于好奇,为什么占位符 1 基于?意思是_1是第一个参数,不是_0。

【问题讨论】:

    标签: c++ c++11 placeholder stdbind


    【解决方案1】:

    因为boost::bind 就是这样做的,而 Boost.Bind 作者编写了将其添加到 TR1 的提案,并被复制到标准中。

    至于为什么 Boost.Bind 这样做,我不知道,但我会冒险猜测它可能与来自 STL 的 1998 年标准中的 std::bind1ststd::bind2nd 匹配。在那种情况下,“第一个”即“第一个”是正确的(即使在从零开始的索引系统中,索引零处的项目也是 first,而不是 zeroth 项目。 )

    所以也许占位符应该是_1st_2nd_3rd_4th 等,但对于不知道ordinal numbers 上不一致的后缀的非英语使用者来说,可能更容易记住@ 987654329@、_2

    不过只是一个疯狂的猜测。我从来没有想过这个问题,所以现在我也很好奇:-)

    【讨论】:

      【解决方案2】:

      约定可能是从前身 Boost.bind 继承而来的。

      为什么 Boost 库选择从 1 开始:作为 C++03 一部分的绑定器使用 first_argument 和 second_argument 作为类型名称。

      C++ 标准库有bind1st()bind2nd(),所以自然泛化到 n 元函数是“bind 3rd”、“bind 4th”等等。

      这些都不是真正的原因,但提供了一个可能的解释。

      【讨论】:

      • 我不会相信“从未听过有人谈论第 0 个参数”,因为您通常甚至不会谈论数组的第 0 个元素。您说“1st”,但它的索引是 0。但是,历史论点是有道理的。标准库有bind1st()bind2nd(),所以n-ary 函数的自然概括是“bind 3rd”、“bind 4th”等等。
      • 我从来没有听说过“zero-st”,但我已经听说过“zero-th”......虽然这并不能使它正确的英语:)跨度>
      • @AndyProwl 是的,这并不令人信服。你能把它编辑出来吗?我在手机上,这很痛苦。
      • @pmr,正如安迪所说(我在回答中说),即使在从零开始的列表中,它仍然是 first 项。但我听说过(TBH 说)“zeroth”,部分是开玩笑的。
      【解决方案3】:

      这样做的一个优点是std::is_placeholder 的工作原理。结果不仅仅是真假,而是占位符本身的值。

      std::is_placeholder<_1>::value == 1
      std::is_placeholder<_2>::value == 2
      std::is_placeholder<_7>::value == 7
      

      但是任何不是占位符的东西都将评估为0(这当然是错误的)。如果占位符从 _0 开始,这将不起作用。

      【讨论】:

      • 虽然这是真的,但可以通过将值 1 赋予 _0 并将值 2 赋予 _1 等来轻松地使其工作,因此非占位符仍然具有值 0。跨度>
      【解决方案4】:

      boost 绑定库的设计者是 MSDOS 批处理语法的粉丝。

      在批处理语法中,%1 指第一个参数,%2 第二个,%3 第三个,依此类推。但是因为% 不是有效的 C++ 标识符,他们将其替换为 _ .

      在 MSDOS 批处理语法中,%0 指的是批处理文件的名称。在这种情况下,_0 将绑定到您调用的函数 _1_2_3 等。

      实际上,不,不是。

      【讨论】:

      • 投了赞成票,因为我猜很多人从来没有进入你答案的最后一行......我实际上在想一些类似但很严肃的事情,关于 POSIX shell ($0, @987654332 @等)
      猜你喜欢
      • 2021-09-25
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 2013-03-09
      • 2023-03-22
      • 2015-09-25
      • 1970-01-01
      相关资源
      最近更新 更多