Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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++:STD实例的目标::函数返回空指针_C++_Function_Function Pointers - Fatal编程技术网

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,因为编译器现在不允许使用相同的语言版本。