在类作用域内不能将“static_assert”与“sizeof”一起使用(但方法作用域可以)



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

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++(注意:微软风投没有抱怨)中,这产生了类似于:

错误:对不完整的类型"Foo"应用"sizeof"无效

该错误仅发生在第二个static_assert上。

我知道类的定义还没有从词汇上写出来,但一个完整类型的所有信息肯定都在那里,对吧?我的意思是,我们在里面。即使没有,为什么它会在方法中起作用?

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

类说明符的结束}处,类被视为完全定义的对象类型(或完整类型)。在类成员规范中,该类被视为函数内的完整类主体、默认参数、使用声明的引入继承构造函数(12.9)、异常规范,以及非静态数据成员(包括嵌套类中的此类内容)的大括号或相等的初始值设定项。否则,它在其自己的类成员规范中被视为不完整。

想一想,编译器应该如何知道你没有

int another_var;

就在static_assert之后?

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

最新更新