为什么从std :: placeholders :: _ 1开始而不是_0?

wal*_*rii 12 c++ placeholder stdbind c++11

c ++中的大部分内容都是0,而不是基于1.出于好奇,为什么占位符1基于?含义_1是第一个参数,而不是_0.

Jon*_*ely 14

因为它是如何boost::bind做的,Boost.Bind作者写了将其添加到TR1的提案,并将其复制到标准中.

至于为什么Boost.Bind做这样的说法,我不知道,但我会大胆地猜测它可能是相匹配std::bind1ststd::bind2nd从1998年的标准,该标准来自于STL.在该上下文中,"1st"即"first"是正确的(即使在从零开始的索引系统中,索引为零的项目是第一个,而不是第0个项目.)

所以,也许占位符应_1st,_2nd,_3rd,_4th等,但对于非英语为母语的,谁也不知道在不一致的后缀序号,它可能更容易记住_1,_2等等.

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


pmr*_*pmr 6

该公约可能是从前任Boost.bind转移而来的.

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

C++标准库有bind1st()bind2nd(),因此对n-ary函数的自然概括是"bind 3rd","bind 4th",依此类推.

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


Rya*_*ing 5

这样做的一个优势是std::is_placeholder. 结果不只是对或错,而是占位符本身的值。

std::is_placeholder<_1>::value == 1
std::is_placeholder<_2>::value == 2
std::is_placeholder<_7>::value == 7
Run Code Online (Sandbox Code Playgroud)

但是任何不是占位符的东西都会评估为0(当然,这是错误的)。如果占位符从_0这里开始就行不通了。