繁体   English   中英

不能在类范围内使用`static_assert`和`sizeof`(但方法范围可以)

[英]Cannot use `static_assert` with `sizeof` inside class scope (but method scope is okay)

以下是一个简单示例的摘录(请参阅此处完整源代码 ):

class Foo final {
    public:
        int var;

        inline Foo(void) {
            static_assert(sizeof(Foo)==sizeof(int),"Implementation error!");
        }

        static_assert(sizeof(Foo)==sizeof(int),"Implementation error!");
};

在最近的g ++(NB MSVC不抱怨),这产生如下:

错误:'sizeof'无效应用于不完整类型'Foo'

该错误发生在第二个static_assert

我理解这个类的定义还没有完全被词法写出来,但是肯定所有关于完整类型的信息都存在,对吧? 我的意思是,我们在里面 即使不是,为什么它会在方法中起作用?

类类型在其自己的成员函数体内完成(正如Matt所说,函数体的处理是延迟的)。 它在类定义的{}内的大多数其他地方都不完整,包括static_assert 9.2节的规则是

一类被认为是在闭合完全定义的对象类型(或完整的类型) }类指定符 在类成员规范中 ,该类在函数体,缺省参数,引入继承构造函数(12.9)的使用声明异常规范和非静态数据成员的括号或等于初始化器中被视为完整(包括嵌套类中的这类东西)。 否则,它在其自己的类成员规范中被视为不完整。

想一想,编译器应该怎么知道你没有

int another_var;

static_assert之后出现?

static_assert的最佳位置可能就在类定义之后,在命名空间范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM