该指针是否总是一个运行时结构?



我正在学习c++中的this指针。我在标准中遇到了下面的语句:

表达式e是一个核心常量表达式,除非e的求值符合抽象机的规则,将求值为下列表达式之一:

  • this,除非在constexpr函数或constexpr构造函数中作为e的一部分被求值;

我不明白上面引用的语句的意思。我认为this指针是一个运行时结构因此,它不能在编译时上下文中使用。但在上述上下文中,上述说法似乎暗示了另一种情况。我的第一个问题是这是什么意思?谁能举个例子,以便我能理解那句话的意思?


我试图创建一个例子,以更好地理解自己的语句的含义,但程序没有按预期工作(这意味着它给出了错误,而我认为它应该根据引用的语句工作):

struct Person 
{
constexpr int size()
{
return 4;
}
void func()
{
int arr[this->size()]; //here size is a constexpr member function and so "this" should be a core constant expression and arr should not be VLA
}

};

演示在上面的程序中,我认为我们可以使用表达式this->size()作为数组的大小(必须是编译时常数),因为sizeconstexpr,因此引号语句适用,因此程序应该编译。此外,由于sizeconstexprarr不应该是VLA。但令我惊讶的是,arr似乎是VLA,该程序也不能在msvc中编译(因为msvc没有VLA,我认为)。我的第二个问题是为什么引用的语句不适用于上面的例子,为什么是arrVLA?我的意思是size是constexpr,所以arr不应该是VLA。

在核心常量表达式中使用this的唯一方法是调用构造函数(并在构造函数中使用它)或调用现有对象的成员函数。

this,除非在constexpr函数或constexpr构造函数中作为e的一部分求值;

(重点)

在您的尝试中,常量表达式应该是this->size(),但Person::func(this出现在其中的函数)没有作为该表达式的一部分进行评估。

一个简单的例子:

struct S {
int i = 0;
constexpr S(int x) {
this->i = x;
}
constexpr int get_i() const {
return this->i;
}
};
// `this` used in constructor
constexpr S s{7};
// `this` used in `S::get_i`
static_assert(s.get_i() == 7);
static_assert(S{4}.get_i() == 4);

演示:https://godbolt.org/z/hea8cvcxW

相关内容

最新更新