std::function 别名声明给出不完整的类型编译器错误

std::function with alias declaration gives incomplete type compiler error

我在玩 std::function 时遇到了我不明白的行为。我希望有人能向我解释问题底部的代码中发生了什么。

直接提供函数类型当然可行。与 typedef 类似。 当我使用别名声明(两行注释掉的行)时,“有趣”的部分就开始了。使用 using 声明类型会导致编译器给我一个错误:

[build] /home/lehu/workspaces/cpp-learning/std-func/main.cpp: In function ‘int main()’:
[build] /home/lehu/workspaces/cpp-learning/std-func/main.cpp:17:37: error: aggregate ‘std::function<int (&)()> func2’ has incomplete type and cannot be defined
[build]    17 |     std::function<test_func_type_2> func2;
[build]       |                                     ^~~~~
[build] gmake[2]: *** [std-func/CMakeFiles/std-func.dir/build.make:82: std-func/CMakeFiles/std-func.dir/main.cpp.o] Błąd 1

我检查了类型,typeid 显示 test_func_type_1test_func_type_2 具有相同的类型(以下是程序的输出):

1
FivE
FivE

如果类型相同,为什么一个版本有效而​​另一个版本无效?!?

我摆弄的代码:

#include <functional>
#include <iostream>

int test_func() {
    return 10;
}

int main() {
    std::function<int()> func;   //providing function type directly is ok
    func = test_func;

    typedef int (test_func_type_1)();
    std::function<test_func_type_1> func1;  //typedef works as well
    func1 = test_func;

    using test_func_type_2 = int (&) ();  //alias declaration is ok (can't use function pointer!)
    //std::function<test_func_type_2> func2; <-- here we get compiler error
    //func2 = test_func;

    std::cout << (typeid(test_func_type_1) == typeid(test_func_type_2) ) << std::endl;

    std::cout << typeid(test_func_type_1).name() << std::endl;
    std::cout << typeid(test_func_type_2).name() << std::endl;
    return 0;
}

编辑

  1. 改变是真的
using test_func_type_2 = int (&) ();

进入

using test_func_type_2 = int ();

导致错误消失。 但是我想了解为什么我的版本无法编译,即使类型明显相同

int (&) ()int () 不是同一类型。前者是对后者的参考。 typeid 给出相同的结果,因为它忽略了引用。

[expr.typeid]/4:

If the type of the type-id is a reference to a possibly cv-qualified type, the result of the typeid expression refers to a std​::​type_­info object representing the cv-unqualified referenced type.