【发布时间】:2019-10-20 12:58:29
【问题描述】:
我正在尝试使用带有模板的函数指针作为参数。但编译器似乎无法处理 lambda 和 nullptr。
当我在以下代码中将void (*callback)(T input) 更改为void (*callback)(int input) 时,一切都很好。
此编译器行为是否由 C++ 标准指定?
我使用的编译命令是 $ g++ main.cpp -std=c+11,但与 Visual Studio 2019 中的行为相同。
template <class T>
int dummy (T tmp, void (*callback)(T input)) {
// Doesn't do anything, just trying to compile
// If I change (T input) to (int input), it compiles fine
if (callback)
return 1;
else
return 0;
}
void callback (int input) {
return;
}
int main () {
int tmp = 10;
auto callback_lambda = [](int input) -> void {
return;
};
dummy(tmp, callback); // Compiles OK
dummy(tmp, callback_lambda); // Error: mismatched types 'void (*)(T)' and 'main()::<lambda(<int>)'
dummy(tmp, nullptr); // Error: no matching function for call to 'dummy(int&, std:nullptr_t)'
return 0;
}
【问题讨论】:
标签: c++ templates lambda language-lawyer function-pointers