C++ 编译包含模板函数指针的初始值设定项列表时,gcc出错,但clang错误
下面的代码段在vc++和clang++中编译得很好,但在gcc(inc 9.2)中编译失败,除非我添加显式转换。哪个编译器在这里?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
#包括
模板
无效任务(无效){}
int main()
{
对于(自动p_任务:{&task}){}//错误
//对于(自动p_任务:{static_cast(&task)}){}//ok
}
:在函数“int main()”中:
:8:33:错误:无法推断'std::initializer_listGCC是错误的,但不再是错误的!感谢@Barry的报告和Marek Polacek的修复,现在可以使用GCC主干(未来的GCC 11)编译。注:不需要基于范围的循环来导致此问题<代码>自动l={&Task}
也执行相同的()操作。这似乎是gcc编译器中的一个错误。有趣的是,如果您执行+Task
,这意味着&Task
在gcc中可能存在类型歧义,而隐式转换不存在这种歧义。例如,当应用于全局函数时,gcc可能只忽略&
,而全局函数的模糊性为void(*)(
vsvoid()
或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
}