下面的代码有函数指针的参数(带auto
说明符),
void g( bool(*fptr)(const auto) ){
//
}
bool f(const int a){
//
}
int main(int argc, char *argv[])
{
g(&f); // Error
}
工作正常。
使用此代码,
bool k(const auto); // Compiler accepts declaration with auto specifier
auto h(auto& output, const auto& value) // Compiler accepts definition with auto specifier
{
// output << value << "\n";
}
typedef bool(*fptr)(const auto); // Error
void g( fptr f ){
//
}
bool f(const int a){
//
}
int main(int argc, char *argv[])
{
g(&f);
}
g++ -std=c++14
说,error: non-function ‘fptr’ declared as implicit template
问题:
为什么C ++编译器不允许auto
使用函数指针?
答案 0 :(得分:5)
auto
是一个gcc扩展,虽然它会在概念TS合并时标准化。
我从未使用过这个扩展,但这可能只是模板声明的捷径,即
void g( bool(*fptr)(const auto) ) {}
template<typename T>
void g( bool(*fptr)(const T) ) {}
都是等价的。您无法在typedef
声明中使用模板,您必须使用using
声明:
using fptr = bool(*)(const auto); // ok
由于某些原因,代码仍然无法编译,因为它无法将decltype(&f)
(bool(*)(int)
}转换为fptr
。这是延伸的错误。使用标准C ++,您的代码编译得很好:
template<typename T>
using fptr = bool(*)(const T);
template<typename T>
void g( fptr<T> fa ) {}