c ++函数签名的语法规范(关键字/上下文关键字排序)是什么?

Lor*_*ins 3 c++

丰富的c ++表现力和语法使得在单个签名上使用该语言的多个功能变得有些困难.

例如,我想将成员函数[1]声明为:

  • virtual
  • override //上下文关键字的示例
  • noexcept
  • const
  • 具有尾随返回类型

如果我们认为函数也可以,它会变得更复杂

  • 默认
  • 删除
  • final(用于虚拟方法)
  • 模板
  • 明确的专业化
  • [[deprecated]]
  • ......还有很多我现在都不知道/怀疑的

标准的措辞看起来像希腊语,即使这不是真的,我不知道什么适用于什么(或什么是语法上的不幸,例如[1]甚至可能是非法的).

我知道阅读单个功能(覆盖,noexcept等)会有所帮助,但有没有关于如何在共同使用中使用它们的指南?(从语法上讲;我希望/想要回答功能的功能)

编辑

为了防止它有所帮助,我认为要解读的摘录如下

8.4.1功能定义具有形式

function-de fi nition:attribute-speci-er-seqopt decl-speci-er-seqopt declarator virt-speci-er-seqopt function-body

Die*_*Epp 5

如果您有规范的副本,则可以在每个部分中查找语法.听起来你想要一个完整的指南来指出什么是正确的,而且规范是这个信息的唯一真正来源.幸运的是,阅读并不困难,这只是耗时且乏味的.

这是函数定义的语法,取自N3690的8.4.1节的开头.我建议首先阅读关于无上下文语法的入门读物(维基百科 - 跳到示例).请注意,每个人在编写无上下文语法方面都有自己的变体,因此C++规范中的语法与您在维基百科或编译器教科书中看到的语法略有不同.

function-definition:
    attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt function-body
function-body:
    ctor-initializeropt compound-statement
    function-try-block
    = default ;
    = delete ;

阅读本文,我们看到"功能体"有四种选择,每行一种.两个选择= delete= default,所以那些走在一个相同的地方{ ... }更有趣的功能,身体会去.(函数try块是在C++中定义函数的一种模糊方式,所以让我们忽略它.)

对于"函数定义",您可以看到它有一行,因此只有一种方法来定义函数.该行中的每个项目都必须按顺序显示.带有"opt"下标的零件是可选的.所以,

  1. 属性首先
  2. 声明符接下来的(如static,int,extern...)
  3. 之后的声明者(例如function_name(int x, int y) -> int)
  4. 之后的虚拟说明符(overridefinal)
  5. 函数体最后(这包括正常的函数体{ ... }以及= delete= default)

一旦你有一点练习阅读CFG,它就成了第二天性.唯一困难的部分是跳过C++规范来找到你想要的所有定义.

笔记

另请注意,语法只会告诉您语法.如果你只是阅读语法,你会写废话,如:

// permissible, according to the grammar
extern static const void long short int int x;
Run Code Online (Sandbox Code Playgroud)

阅读文本将解释你不能,例如,有一个short long,即使它是语法允许的.

另一个技巧是找到你正在寻找的定义.正如Serthy在下面问的那样,你如何指定纯函数?哪里= 0去了?好吧,你可以找到= 0第9.2节中的内容pure-specifier,但它只能出现在member-declarator.所以它不能出现function-definition,它只能出现在"声明"中.声明和定义语法略有不同.

换句话说,您无法定义纯函数,但可以声明纯函数.

进一步阅读

如果您对此主题感兴趣,我推荐Alfred V. Aho,Ravi Sethi和Jeffrey D. Ullman的编译器:原理,技术和工具.