Pav*_*nko 20 c++ function-pointers default-parameters c++11 c++14
以下代码无法使用g ++版本5.4.0编译并带有选项-std=c++1y:
void f(int=0) ;
int main() {
f(); // ok
(*f)(2);// ok
(*f)();// ok c++11; error with c++14: too few arguments to function
return 0;
}
Run Code Online (Sandbox Code Playgroud)
声明的函数有默认参数,所以这里有什么问题?感谢帮助.
为什么要g++ -c -std=c++11编译?
Sto*_*ica 25
接受(*f)()有效是GCC错误.标准的字母表示使用带有一元*的函数名称会导致函数名称衰减为指针.然后应该取消引用指针以获得调用表达式的函数地址.
但GCC似乎很聪明,并且省略了上述行为.它(*f)简单地视为f.并且f可以使用默认参数进行调用.
然而,人们可以强迫GCC预先形成衰变.+应用于函数名称的一元将强制衰减为指针.所以以下两点:
(+f)();
(*+f)();
Run Code Online (Sandbox Code Playgroud)
导致GCC error: too few arguments to function在GCC 7.2和GCC 6.3中的标准修订版上发出.
默认参数不是函数类型的一部分,因此当您隐式地将函数转换为函数指针然后间接转换指针时,它们将被丢弃.