다음 코드를 고려하세요.
#include <cctype> #include <functional> #include <iostream> int main() { std::invoke(std::boolalpha, std::cout); // #1 using ctype_func = int(*)(int); char c = std::invoke(static_cast<ctype_func>(std::tolower), 'A'); // #2 std::cout << c << "\n"; }
여기서 코드에는 std::invoke에 대한 두 가지 호출이 있습니다. 라인 #1은 std::boolalpha의 주소를 취하고, 라인 #2는 std::tolower로 동일한 작업을 시도합니다. 예상 출력은 'a'입니다.
질문이 생깁니다. 예상 출력이 C 20에서 보장됩니까? 이에 답하려면 주소 지정 가능 함수의 개념을 자세히 살펴봐야 합니다.
[namespace.std]에 따르면 명시적으로 주소 지정 가능으로 지정되지 않는 한 표준 라이브러리 함수 또는 해당 참조에 대한 포인터를 얻으려는 시도는 정의되지 않은 동작입니다. (아마도 잘못된 형식). 이 금지 사항은 표준 라이브러리의 비정적 멤버 함수에 대한 멤버 포인터 형성까지 확장됩니다.
Line #1:
std ::boolalpha는 [fmtflags.manip]에 의해 주소 지정 가능한 함수로 지정됩니다. 즉, 해당 주소를 가져오는 것이 std::cout.setf(std::ios_base::boolalpha)와 동일하게 형식이 잘 지정되어 있음을 의미합니다.
Line #2:
안타깝게도 std::tolower는 [cctype.syn]에서 주소 지정이 가능한 것으로 명시적으로 지정되지 않았습니다. 따라서 주소를 가져오려는 Line #2의 시도는 정의되지 않은 동작(형식이 잘못되었을 수 있음)을 갖습니다.
예상되는 출력은 보장되지 않습니다. 실제로, 라인 #2의 정의되지 않은 동작으로 인해 코드 컴파일이 보장되지 않습니다.
이 문제는 멤버 함수에도 적용됩니다. [namespace.std]에 명시되어 있듯이 표준 라이브러리 멤버 함수에 대한 포인터를 가져오는 경우 동작이 정의되지 않습니다.
위 내용은 C 20에서 표준 라이브러리 함수의 주소를 가져올 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!