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_1
和 test_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;
}
编辑
- 改变是真的
using test_func_type_2 = int (&) ();
进入
using test_func_type_2 = int ();
导致错误消失。 但是我想了解为什么我的版本无法编译,即使类型明显相同。
int (&) ()
和 int ()
不是同一类型。前者是对后者的参考。 typeid
给出相同的结果,因为它忽略了引用。
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.
我在玩 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_1
和 test_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;
}
编辑
- 改变是真的
using test_func_type_2 = int (&) ();
进入
using test_func_type_2 = int ();
导致错误消失。 但是我想了解为什么我的版本无法编译,即使类型明显相同。
int (&) ()
和 int ()
不是同一类型。前者是对后者的参考。 typeid
给出相同的结果,因为它忽略了引用。
If the type of the type-id is a reference to a possibly cv-qualified type, the result of the
typeid
expression refers to astd::type_info
object representing the cv-unqualified referenced type.