C++의 대부분은 0이며 1은 아닙니다. 호기심에서, 자리 표시 자 1은 왜 기초가됩니까? 의미 _1은 _0이 아닌 첫 번째 매개 변수입니다._0 대신 std :: placeholders :: _ 1로 시작하는 이유는 무엇입니까?
답변
이것이 boost::bind
의 기능이며 Boost.Bind 작성자가 TR1에 추가 할 제안서를 작성하여 표준에 복사했습니다.
Boost.Bind가 그렇게하는 이유는 무엇인지 모르겠지만 STL에서 나온 1998 년 표준의 std::bind1st
과 std::bind2nd
과 일치해야 할 수도 있습니다. 그 맥락 "1"에서 즉 "최초의"올바른 (인덱스 제로의 항목이 아닌 제로 번째, 항목 첫에도 제로 기반 색인 시스템.)
그래서 아마 자리가해야 _1st
, _2nd
, _3rd
, _4th
등을 할 수 있지만, ordinal numbers에 일치하지 않는 접미사를 모르는 영어 이외의 스피커는하지만 _1
, _2
등
그냥 추측을 기억하는 것이 더 쉬울 것입니다. 질문이 나에게 발생하지 않았으므로 이제는 궁금하다 .-
이 규칙은 이전 버전 인 Boost.bind에서 가져온 것입니다.
Boost 라이브러리가 1로 시작하는 이유 : C++ 03의 일부인 바인더는 first_argument 및 second_argument를 유형 이름으로 사용했습니다.
C++ 표준 라이브러리는 bind1st()
및 bind2nd()
이므로 n-ary 함수에 대한 일반적인 일반화는 "제 3 바인딩", "바인딩 4th"등입니다.
두 가지 모두 실제 이유는 아니지만 가능성있는 설명을 제공합니다.
부스트 바인드 라이브러리의 설계자는 MSDOS 배치 구문의 팬이었다. 배치 구문
는 %1
첫번째 인수 %2
번째 %3
제 등을 지칭하지만 %
유효한 C++ 식별되지 않기 때문에, 그들은 _
로 대체.
MSDOS 배치 구문에서 %0
은 배치 파일의 이름을 나타냅니다. 이 경우 _0
은 _1
, _2
, _3
등의 기능에 바인딩됩니다.
사실, 아니요, 실제로는 아닙니다.
Upvoted 나는 많은 사람들이 당신의 대답의 마지막 줄을 만들지 않았다고 추측하고 있기 때문에 POSIX 쉘 ('$ 0','$ 1' 등)에 대해서 실제로 비슷하지만 심각하다고 생각했다. –
이점은 std::is_placeholder
의 작동입니다. 결과는 true 또는 false가 아니라 자리 표시 자 자체의 가치입니다.
std::is_placeholder<_1>::value == 1
std::is_placeholder<_2>::value == 2
std::is_placeholder<_7>::value == 7
아무것도하지만 자리 표시 자 (물론 거짓이다) 0
로 평가하지 않습니다. 자리 표시자가 _0
에서 시작하면 이는 작동하지 않습니다.
true이면, '_0'에 값 1을,'_1'에 값 2를 부여하여 쉽게 작동하도록 만들 수 있습니다. 따라서, non-placeholder는 여전히 값 0을 갖습니다. –
일반적으로 배열의 0 번째 요소에 대해서 말하지 않기 때문에 나는 "누군가 제 0 인수에 대해 이야기하는 것을 들어 보지 못했습니다"라는 것을 구입하지 않을 것입니다. "1st"라고 말하면서 인덱스는 0입니다. 그러나 역사적인 주장은 의미가 있습니다.표준 라이브러리는'bind1st()'와'bind2nd()'를 가지고 있었기 때문에'n'-ary 함수에 대한 자연적인 일반화는 "제 3 바인딩", "제 4 바인딩"등이있었습니다. –
나는 "zero-st"라는 말을 들어 본 적이 없지만 "zero-th"라고 들었습니다 ... 그것은 올바른 영어가 아닙니다. :) –
@AndyProwl 예, 정말 설득력이 없습니다. 편집 할 수 있습니까? 나는 모바일에있어 고통 스럽다. – pmr