这个指针总是一个运行时构造吗

Is this pointer always a runtime construct

我正在学习 C++ 中的 this 指针。我从标准中遇到了以下 statement

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine, would evaluate one of the following expressions:

  • this, except in a constexpr function or a constexpr constructor that is being evaluated as part of e;

我不明白上面引用的语句的含义。我认为 this 指针是一个 运行时构造 ,因此它不能在编译时上下文中使用。但在上述情况下,上述陈述似乎另有所指。 我的第一个问题是这是什么意思。谁能举个例子让我明白这句话的意思。


我试图自己创建一个 example 来更好地理解该语句的含义,但程序没有按预期运行(这意味着它给出了错误,而我认为它应该按照引用的方式运行声明):

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
    }
    
};

Demo

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

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

this except in a constexpr function or a constexpr constructor that is being evaluated as part of 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