【发布时间】:2013-02-25 23:27:32
【问题描述】:
c++ 中的大多数内容都是 0,而不是基于 1。只是出于好奇,为什么占位符 1 基于?意思是_1是第一个参数,不是_0。
【问题讨论】:
标签: c++ c++11 placeholder stdbind
c++ 中的大多数内容都是 0,而不是基于 1。只是出于好奇,为什么占位符 1 基于?意思是_1是第一个参数,不是_0。
【问题讨论】:
标签: c++ c++11 placeholder stdbind
因为boost::bind 就是这样做的,而 Boost.Bind 作者编写了将其添加到 TR1 的提案,并被复制到标准中。
至于为什么 Boost.Bind 这样做,我不知道,但我会冒险猜测它可能与来自 STL 的 1998 年标准中的 std::bind1st 和 std::bind2nd 匹配。在那种情况下,“第一个”即“第一个”是正确的(即使在从零开始的索引系统中,索引零处的项目也是 first,而不是 zeroth 项目。 )
所以也许占位符应该是_1st、_2nd、_3rd、_4th 等,但对于不知道ordinal numbers 上不一致的后缀的非英语使用者来说,可能更容易记住@ 987654329@、_2等
不过只是一个疯狂的猜测。我从来没有想过这个问题,所以现在我也很好奇:-)
【讨论】:
约定可能是从前身 Boost.bind 继承而来的。
为什么 Boost 库选择从 1 开始:作为 C++03 一部分的绑定器使用 first_argument 和 second_argument 作为类型名称。
C++ 标准库有bind1st() 和bind2nd(),所以自然泛化到 n 元函数是“bind 3rd”、“bind 4th”等等。
这些都不是真正的原因,但提供了一个可能的解释。
【讨论】:
bind1st() 和bind2nd(),所以n-ary 函数的自然概括是“bind 3rd”、“bind 4th”等等。
这样做的一个优点是std::is_placeholder 的工作原理。结果不仅仅是真假,而是占位符本身的值。
std::is_placeholder<_1>::value == 1
std::is_placeholder<_2>::value == 2
std::is_placeholder<_7>::value == 7
但是任何不是占位符的东西都将评估为0(这当然是错误的)。如果占位符从 _0 开始,这将不起作用。
【讨论】:
_0 并将值 2 赋予 _1 等来轻松地使其工作,因此非占位符仍然具有值 0。跨度>
boost 绑定库的设计者是 MSDOS 批处理语法的粉丝。
在批处理语法中,%1 指第一个参数,%2 第二个,%3 第三个,依此类推。但是因为% 不是有效的 C++ 标识符,他们将其替换为 _ .
在 MSDOS 批处理语法中,%0 指的是批处理文件的名称。在这种情况下,_0 将绑定到您调用的函数 _1、_2、_3 等。
实际上,不,不是。
【讨论】:
$0, @987654332 @等)