Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以获取标准库中定义的函数的地址吗?_C++_Language Lawyer_C++ Standard Library_C++20_Unspecified Behavior - Fatal编程技术网

C++ 我可以获取标准库中定义的函数的地址吗?

C++ 我可以获取标准库中定义的函数的地址吗?,c++,language-lawyer,c++-standard-library,c++20,unspecified-behavior,C++,Language Lawyer,C++ Standard Library,C++20,Unspecified Behavior,考虑以下代码: #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::tol

考虑以下代码:

#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::cout << std::boolalpha;
C++20是否保证了预期的输出

(注意:有两个函数称为
tolower
——一个在
中,另一个在
中。显式强制转换用于选择所需的重载。)

简短回答 没有

解释 说:

F
表示标准库函数()、标准库静态成员函数或标准库函数模板的实例化。 <>强>除非<代码> f>代码>被指定为可寻址函数,如果显式或隐式地尝试形成一个指向“代码> f< /COD>”的指针,C++程序的行为是未指定的(可能是不正确的)。< /强> [注:形成此类指针的可能方法包括应用一元
&
运算符(),
地址
(),或函数到指针的标准转换()。 — [完注] 此外,如果试图对“代码> f>代码>形成引用,或者如果试图形成指向指定标准库非静态成员函数(或)标准库成员函数模板的实例化的成员的指针,则C++程序的行为是未指定的(可能是不正确的)。 记住这一点,让我们检查对
std::invoke
的两个调用

第一个电话 在这里,我们试图形成一个指向
std::boolalpha
的指针。幸运的是,它拯救了这一天:

本款中指定的每个函数都是指定的可寻址函数()

boolalpha
是本子条款中指定的函数。 因此,这条线结构良好,相当于:

std::cout.setf(std::ios_base::boolalpha);
但为什么呢?那么,下面的代码是必要的:

#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::cout << std::boolalpha;

std::cout Related(尽管本文没有涉及可寻址函数的概念)。有趣的是,C标准采取了完全相反的观点:“……除非在详细描述中另有明确说明……允许采用库函数的地址。”(
setjmp
是C库函数的一个示例,其地址可能无法获取,请参见。)@L.F.这是否也适用于容器的成员函数?例如
&std::vector::operator[]
错了吗?我相信上面引用的标准中没有提到这一点。我想看看
的定义不是什么
is@RinKaenbyou是的。从技术上讲,我们需要将
tolower
包装在lambda中。哇,这是一个令人惊讶的问题
std::cout << std::invoke(static_cast<ctype_func>(std::tolower), 'A') << "\n";