C++中的大部分內容都是0,而不是1。出於好奇,爲什麼佔位符1基於?含義_1是第一個參數,而不是_0。爲什麼從std :: placeholders :: _ 1開始而不是_0開始?
回答
因爲這就是boost::bind
這樣做的原因,Boost.Bind作者寫了建議將它添加到TR1中,並將其複製到標準中。
至於爲什麼Boost.Bind這樣做,我不知道,但我會冒險猜測它可能與來自STL的1998標準中的std::bind1st
和std::bind2nd
匹配。在這種情況下「第一」,即「第一」是正確的(即使是從零開始的索引系統索引零的項目是第一,而不是零,項)。
所以也許佔位符應是_1st
,_2nd
,_3rd
,_4th
等,但對於非英語國家,誰也不知道在ordinal numbers不一致的後綴,它可能更容易記住,雖然_1
,_2
等
只是胡亂猜測。這個問題從來沒有發生過,所以現在我很好奇:-)
該公約可能由前身Boost.bind繼承。
至於爲什麼Boost庫選擇從1開始:已經是C++ 03的一部分的綁定器使用first_argument和second_argument作爲類型名稱。
C++標準庫有bind1st()
和bind2nd()
,所以對n元函數的自然概括是「bind 3rd」,「bind 4th」等等。
這些都不是真正的原因,但提供了一個可能的解釋。
boost bind庫的設計者是MSDOS批處理語法的粉絲。
在分批語法,%1
是指第一個參數,%2
第二,%3
第三等,但因爲%
不是有效的C++標識符,它們與_
取而代之。
在MSDOS批處理語法中,%0
指的是批處理文件的名稱。在這種情況下,_0
將被綁定到您稱爲_1
,_2
,_3
等的功能。其實不,不是真的。
Upvoted因爲我猜很多人從來沒有把它放到你答案的最後一行......我實際上正在想類似但很嚴肅的事情,關於POSIX shell('$ 0','$ 1'等) – 2015-07-14 09:10:49
這個優點是std::is_placeholder
的工作。結果不只是真或假,它是佔位符本身的價值。
std::is_placeholder<_1>::value == 1
std::is_placeholder<_2>::value == 2
std::is_placeholder<_7>::value == 7
但任何非佔位符將評估爲0
(當然這是錯誤的)。如果佔位符以_0
開頭,則這不起作用。
雖然這是真實的,可以很容易地通過賦予'_0'的值1和'_1'的值2來工作,所以非佔位符仍然具有值0。 – 2016-10-23 12:46:40
- 1. 爲什麼應該從0開始而不是從1開始?
- 2. 爲什麼增量計數從0開始而不是從1開始?
- 3. 爲什麼我的集合決定從0開始而不是1開始?
- 4. 爲什麼inode數字從1開始而不是0?
- 5. 爲什麼MySQL從1開始計數而不是0?
- 6. For循環從0001開始而不是從1開始
- 7. 爲什麼sqlite3_bind_ *從索引1開始,但sqlite3_column_ *從0開始?
- 8. 酒吧從1開始而不是0
- 9. 從1開始代碼而不是0?
- 10. 在JDBC中,爲什麼準備語句的參數索引從1開始而不是從0開始?
- 11. Jar不是從雙擊開始,而是從命令行開始
- 12. 從範圍開始的Excel VBA數組從-1開始而不是0
- 13. 從1開始
- 14. rowindex始終從零開始......爲什麼?
- 15. 爲什麼我決定從AngularJS開始,而不是Angular 2
- 16. 爲什麼CGAffineTransformMakeScale從原始位置開始而不是從當前位置開始?
- 17. 爲什麼Genymotion不開始?
- 18. CMake |爲什麼不開始?
- 19. F#Seq.FindIndex從結尾開始而不是從頭開始?
- 20. 爲什麼matplotlib子圖開始於1
- 21. 使BufferedReader從.txt文件的中間開始而不是開始?
- 22. 如何開始迭代而不是從一開始
- 23. JavaScript告訴視頻從一秒開始而不是零開始
- 24. 從位置1開始NSArray不是0
- 25. Highstock Navigator始終從1970-1-1開始
- 26. 爲什麼的std :: CBEGIN返回相同類型的std ::開始
- 27. 爲什麼最後調用GC.KeepAlive,而不是一開始?
- 28. 這個選項會讓avconv將視頻轉換爲從0開始而不是從1開始的圖像嗎?
- 29. 活動未開始;另一項活動是開始而不是
- 30. 從1而不是0開始json_encode數字鍵
我不會購買「從未聽過有人在談論第0參數」,因爲你通常不會談論數組的第0個元素。你說「1st」,但它的索引是0.但是,歷史性的論點是有道理的。標準庫具有'bind1st()'和'bind2nd()',所以對''''''ary函數的自然概括是「bind 3rd」,「bind 4th」等等。 – 2013-03-10 21:11:27
我從來沒有聽說過「零st」,但我聽到「zero-th」......雖然沒有使它正確英文:) – 2013-03-10 21:13:30
@AndyProwl是的,這不是真的令人信服。你能把它編輯出來嗎?我在移動,這是一個痛苦。 – pmr 2013-03-10 21:14:13