C++:STD实例的目标::函数返回空指针
已编译以下代码:C++:STD实例的目标::函数返回空指针,c++,function,function-pointers,C++,Function,Function Pointers,已编译以下代码: #include <iostream> #include <functional> typedef void (*f_type) (int a); void say(int a) { std::cout << a << "!" << std::endl; } int main() { int a=5; say(a); std::function<vo
#include <iostream>
#include <functional>
typedef void (*f_type) (int a);
void say(int a)
{
std::cout << a << "!" << std::endl;
}
int main()
{
int a=5;
say(a);
std::function<void(int)> fn{say};
f_type fn_pointer = fn.target<void(int)>();
if(fn_pointer)
fn_pointer(a);
else
std::cout << "null ptr" << std::endl;
return 0;
}
我想理解为什么target返回一个空ptr,而不是一个指向函数say的指针
<>注释:它编译为C++到C++ 14,对于C++ 17,编译失败,对我来说是神秘的:
In file included from /usr/include/c++/7/functional:58:0,
from main.cpp:11:
/usr/include/c++/7/bits/std_function.h: In instantiation of ‘_Functor* std::function<_Res(_ArgTypes ...)>::target() [with _Functor = void(int); _Res = void; _ArgTypes = {int}]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',28)">main.cpp:28:46</span>: required from here
/usr/include/c++/7/bits/std_function.h:733:9: error: invalid use of const_cast with type ‘void (*)(int)’, which is a pointer or reference to a function type
return const_cast<_Functor*>(__func);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在VS2017上复制它,似乎目标方法返回指向指针的指针,就像返回指向存储在对象中的实际函数指针的指针一样,并相应地期望其模板类型参数。下面是一个经过修改的示例:
#include <iostream>
#include <functional>
typedef void(*f_type) (int a);
void say(int a)
{
std::cout << a << "!" << std::endl;
}
int main()
{
int a = 5;
say(a);
std::function<void(int)> fn{say};
f_type* fn_pointer = fn.target<void(*)(int)>();
if (fn_pointer)
(*fn_pointer)(a);
else
std::cout << "null ptr" << std::endl;
return 0;
}
这产生了以下输出:
5!
booooo
在VS2017上复制它,似乎目标方法返回指向指针的指针,就像返回指向存储在对象中的实际函数指针的指针一样,并相应地期望其模板类型参数。下面是一个经过修改的示例:
#include <iostream>
#include <functional>
typedef void(*f_type) (int a);
void say(int a)
{
std::cout << a << "!" << std::endl;
}
int main()
{
int a = 5;
say(a);
std::function<void(int)> fn{say};
f_type* fn_pointer = fn.target<void(*)(int)>();
if (fn_pointer)
(*fn_pointer)(a);
else
std::cout << "null ptr" << std::endl;
return 0;
}
这产生了以下输出:
5!
booooo
它不是为我编译的。它不是用c++11编译的。@cigien刚检查过,它是为c++14编译的,但不是为更新版本编译的。您使用的是哪种编译器?@idclev463035818我恐怕不会给出令人激动的答案:onlinegdb使用的任何东西都找不到详细信息。我假设这是一个bug,因为编译器现在不允许它使用相同的语言版本。它不是为我编译的。它不是用c++11编译的。@cigien刚检查过,它是为c++14编译的,但不是为更新版本编译的。您使用的是哪种编译器?@idclev463035818我恐怕不会给出令人激动的答案:onlinegdb使用的任何东西都找不到详细信息。我假设这是一个bug,因为编译器现在不允许使用相同的语言版本。