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::bind1st并std::bind2nd从1998年的标准,该标准来自于STL.在该上下文中,"1st"即"first"是正确的(即使在从零开始的索引系统中,索引为零的项目是第一个,而不是第0个项目.)
所以,也许占位符应_1st,_2nd,_3rd,_4th等,但对于非英语为母语的,谁也不知道在不一致的后缀序号,它可能更容易记住_1,_2等等.
只是一个疯狂的猜测.这个问题从来没有发生过,所以现在我也很好奇:-)
该公约可能是从前任Boost.bind转移而来的.
至于为什么Boost库选择从1开始:作为C++ 03一部分的绑定器使用first_argument和second_argument作为类型名称.
C++标准库有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
Run Code Online (Sandbox Code Playgroud)
但是任何不是占位符的东西都会评估为0(当然,这是错误的)。如果占位符从_0这里开始就行不通了。