我正在学习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()
作为数组的大小(必须是编译时常数),因为size
是constexpr,因此引号语句适用,因此程序应该编译。此外,由于size
是constexprarr
不应该是VLA。但令我惊讶的是,arr
似乎是VLA,该程序也不能在msvc中编译(因为msvc没有VLA,我认为)。我的第二个问题是为什么引用的语句不适用于上面的例子,为什么是arr
VLA?我的意思是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