0

如何访问非静态类成员?

class A
{
    int value_ = 0;//I want to access this member in class inheriting from A
};
template<class X = A>
class Y :X
{
static_assert(value_ == 0,"Non-zero not allowed");//here I want to access value_ from X which is A by default. Is this possible?
};
4

1 回答 1

2

由于几个原因,您具体做的事情是不可能的。

首先,static_assert要求它的参数是编译时常量表达式。value_肯定不是。

您可以尝试通过标记它使其成为常量表达式constexpr。但是 C++11 不允许constexpr非静态数据成员。即使它这样做了,那也无济于事,因为value_它是一个非静态成员。因此,它还不存在。它仅在存在实际的类实例时才存在,即具有this指针的东西。您的static_assert表达式不会创建这些对象之一,因此无法访问它。

因此,为了使这个“工作”(在“工作”做一些有意义的事情的范围内),你必须:

  1. 给出A一个constexpr构造函数,以便您可以创建它的constexpr实例化。
  2. static_assert必须使用构造函数实际创建一个类型constexpr并访问有问题的数据成员。

现在,如果你这样做,你会发现它并没有给你你想要的东西(基于这个陈述,因为你的问题没有解释你到底想要完成什么):

其次,每次我的意思是每次创建此类的对象时,因为 X 是模板参数,所以它是一个常量表达式。

注意static_assert静态的。而“每次创建此类的对象”都是运行时事件。您不能对运行时发生的事情执行静态测试。

你要的是正规 assert的,不是static_assert

于 2012-10-21T15:11:05.673 回答