带函数指针的auto说明符 - C ++

时间:2017-05-28 10:11:29

标签: c++ c++14

下面的代码有函数指针的参数(带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使用函数指针?

1 个答案:

答案 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 ) {}