使用默认参数取消引用函数 - C++ 14 vs C++ 11

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 functionGCC 7.2GCC 6.3中的标准修订版上发出.

  • @KeithSmith - **我是**StoryTeller.并且Clang拒绝原始代码,因为它应该.它不会在这里发生错误. (6认同)

Ale*_*iev 8

默认参数不是函数类型的一部分,因此当您隐式地将函数转换为函数指针然后间接转换指针时,它们将被丢弃.

  • 那为什么g ++ -c -std = c ++ 11编译? (3认同)
  • @underscore_d - 然后我更正了.该链接证明GCC的错误已经变得更糟. (2认同)
  • 我对[coliru with GCC 7.2](http://coliru.stacked-crooked.com/a/fc51bad0f736e297)的测试表明该bug仍然存在. (2认同)