>백엔드 개발 >C++ >C 20에서 표준 라이브러리 함수의 주소를 가져올 수 있나요?

C 20에서 표준 라이브러리 함수의 주소를 가져올 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-27 02:54:18538검색

Can You Take the Address of Standard Library Functions in C  20?

표준 라이브러리 함수의 주소를 가져갈 수 있나요?

배경

다음 코드를 고려하세요.

#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.