Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 编译包含模板函数指针的初始值设定项列表时,gcc出错,但clang错误_C++_Templates_C++17_Initializer List_Template Argument Deduction - Fatal编程技术网

C++ 编译包含模板函数指针的初始值设定项列表时,gcc出错,但clang错误

C++ 编译包含模板函数指针的初始值设定项列表时,gcc出错,但clang错误,c++,templates,c++17,initializer-list,template-argument-deduction,C++,Templates,C++17,Initializer List,Template Argument Deduction,下面的代码段在vc++和clang++中编译得很好,但在gcc(inc 9.2)中编译失败,除非我添加显式转换。哪个编译器在这里? #包括 模板 无效任务(无效){} int main() { 对于(自动p_任务:{&task}){}//错误 //对于(自动p_任务:{static_cast(&task)}){}//ok } :在函数“int main()”中: :8:33:错误:无法推断'std::initializer_listGCC是错误的,但不再是错误的!感谢@Barry的报告和Ma

下面的代码段在vc++和clang++中编译得很好,但在gcc(inc 9.2)中编译失败,除非我添加显式转换。哪个编译器在这里?

#包括
模板
无效任务(无效){}
int main()
{
对于(自动p_任务:{&task}){}//错误
//对于(自动p_任务:{static_cast(&task)}){}//ok
}
:在函数“int main()”中:

:8:33:错误:无法推断'std::initializer_list

GCC是错误的,但不再是错误的!感谢@Barry的报告和Marek Polacek的修复,现在可以使用GCC主干(未来的GCC 11)编译。注:不需要基于范围的循环来导致此问题<代码>自动l={&Task}
也执行相同的()操作。这似乎是gcc编译器中的一个错误。有趣的是,如果您执行
+Task
,这意味着
&Task
在gcc中可能存在类型歧义,而隐式转换不存在这种歧义。例如,当应用于全局函数时,gcc可能只忽略
&
,而全局函数的模糊性为
void(*)(
vs
void()
void(&)(
)。或者别的什么。。。我会发送一张罚单。存档。为了添加更多信息,这将在gcc上编译:
{std::addressof(Task)}
,这可能会帮助您找到一个更令人愉快的解决方法(尽管一元加号总是一个吸引人的方法)。@Barry Fix于2020-10-29 20:12:19 UTC向gcc master承诺;gcc trunk现在成功编译了实时演示。
#include <initializer_list>

template<typename T>
void Task(void) {}

int main()
{
    for(auto p_task: {&Task<int>}) {} // error
//  for(auto p_task: {static_cast<void (*)(void)>(&Task<int>)}) {} // ok
}