gpt4 book ai didi

c++ - 类定义中的分号

转载 作者:可可西里 更新时间:2023-11-01 17:29:38 30 4
gpt4 key购买 nike

我正在阅读 this gotw这是那里的代码示例:

struct X {
static bool f( int* p )
{
return p && 0[p] and not p[1:>>p[2];
};
};

问题是:兼容的编译器应该给出多少错误:

我回答了一个,因为这段代码相当于

struct X {
static bool f( int* p )
{
return p && p[0] && ! p[1] > p[2];
};
};

我在想静态函数定义后的分号是错误的。但是萨特先生说 0 并解释说(除了我确实理解的事情)

The "extra" semicolon is allowed at the end of a function declaration.

我的问题是:

  • 标准中的哪些文本允许这样做?
  • 这是否仅指成员函数?
  • 分号能否出现在两个成员之间或类定义中的任何其他位置

     struct X
    {
    int a;;;;int b; //Legal?
    };

最佳答案

是的,在类说明符中的函数声明后明确允许使用分号。因此,目前在 C++0x 草案中,以下内容也是有效的:第一个分号属于函数定义,第二个分号属于委托(delegate)给函数定义非终结符的类说明符。

struct A {
void f() = delete;;
};

但是三个分号是非法的。在具有主体的函数定义之后有两个分号。规范中的相应文本是 9.2[class.mem] 中的语法。

函数定义后的分号在 C++03 中已被允许,但在函数定义后的命名空间范围内不允许使用分号。 C++0x 通过引入空声明来解决这个问题。但是只有当你在类主体之外的函数定义后有一个分号时,它们才会出现。

Sutter 谈到函数声明 末尾的“额外”分号,但这并不完全正确。因为下面是无效语法

struct A {
void f();; // invalid!
};

类说明符中的额外分号仅在函数定义 之后有效。此外,正如 9.2 中的检查所揭示的那样,当函数定义是模板时它是无效的

struct A {
template<typename T> void f() { }; // invalid!
};

这是因为它是由类说明符没有的模板声明解析的(它自己最终会将剩余的文本解析为函数定义)一个额外的 ; 之后。

关于c++ - 类定义中的分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365604/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com