【问题标题】:Incompatible function types allowed in libstdc++? [duplicate]libstdc++ 中允许的函数类型不兼容? [复制]
【发布时间】:2015-06-11 13:13:34
【问题描述】:

我正在编译一个简单的(可能是错误的)C++ 文件:

// file test_function.cpp
#include <functional>

void foo()
{
    void* (*func)() = nullptr;
    std::function<void()> func_(func);
}

我认为func_的类型应该是std::function&lt;void*()&gt;。不出所料,clang++ with libc++ 报错:

$ clang++ -std=c++14 -c -stdlib=libc++ test_function.cpp
test_function.cpp:6:27: error: no matching constructor for initialization of 'std::function<void ()>'
    std::function<void()> func_(func);
                          ^     ~~~~

但是,带有 libstdc++ 的 g++ 和 clang++ 没有给出错误:

$ clang++ -std=c++14 -c -stdlib=libstdc++ test_function.cpp
$ g++ -std=c++14 -c test_function.cpp

情况正常吗? C++标准中有关于函数类型转换的说明吗?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    不知道你为什么认为func的类型应该是std::function&lt;void*()&gt;。毕竟,您将func_ 定义为std::function&lt;void()&gt;func_ 的定义决定了它的类型。

    您得到的错误与您是否可以忽略 func 的返回类型、原始函数指针的问题有关(您选择的名称相当令人困惑 TBH)。这应该是可能的。

    【讨论】:

    • 来自stackoverflow.com/a/9343400/3786245propersafe 用法应该是std::function&lt;void*()&gt;。我说的对吗?
    • 如果您需要返回值,这是正确的用法。如果你不这样做, void() 很好。
    • 谢谢@KABoissonneault 我明白了原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多