这个指针总是一个运行时构造吗
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
}
};
在上面的程序中,我认为我们可以使用表达式 this->size()
作为数组的大小(它必须是一个编译时常量),因为 size
是 constexpr 所以引用的语句适用,所以程序应该编译。此外,由于 size
是 constexpr 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);
我正在学习 C++ 中的 this
指针。我从标准中遇到了以下 statement:
An expression
e
is a core constant expression unless the evaluation ofe
, 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 ofe
;
我不明白上面引用的语句的含义。我认为 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
}
};
在上面的程序中,我认为我们可以使用表达式 this->size()
作为数组的大小(它必须是一个编译时常量),因为 size
是 constexpr 所以引用的语句适用,所以程序应该编译。此外,由于 size
是 constexpr 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 ofe
;
(强调)
在您的尝试中,常量表达式应为 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);