primary-expression: literal this (expression) id-expression lambda-expression fold-expression requires-expression
literal
是一个主表达式,它的类型依赖它的形式。除了字符串字面量的分类是lvalue
;所有其他的字面量的分类都是prvalue
。关键字this
是一个命名的指向一个对象的指针,用与在对象的非静态函数成员的调用或者对象的非静态数据成员的初始化器的求值。
如果在一个类类型X
的成员函数的或者成员模板函数的声明中,this
表达式在可选的cv-qualifier-seq
和在function-definition
,member-declarator
或者declarator
的结尾这个范围里面的类型是指向cv-qualifier-seq X
的指针。它不应该出现在可选cv-qualifier-seq
之前,也不应该出现在静态成员函数声明中。[Note: 即使this
表达式的类型和分类在静态函数成员中跟非静态函数成员中一样。][Note: 在一个trailing-return-type
,对于类类型成员的访问不要求该类类型是完整的类型。类类型成员的声明稍后不可见。]
例子说明:
class A
{
char g();
template <typename T> auto f(T t) -> decltype(t + g())
{
return t + g();
}
};
template auto A::f(int t) -> decltype(t + g());
否则,如果member-declarator
声明一个类类型X
的非静态数据成员,那么在可选的默认成员初始化器中,this
表达式分类是prvalue
并且分类的类型是X *
类型。它不能出现在member-declarator
的其他地方。
this
表达式不应该出现在上面说的之外的其他地方:
例子说明:
class Outer
{
int a[sizeof(*this)]; // 错误,没有出现在成员的默认初始化器中
unsigned int sz = sizeof(*this); // 可以,出现在成员的初始化器中
void f()
{
int b[sizeof(*this)]; // OK
struct Inner
{
int c[sizeof(*this)]; // 错误,没有在局部类型的成员默认初始化器中
};
}
}
(E)
是一个主表达式,这个表达式的类型,值和值的分类跟表达式E
保持一致。表达式(E)
能够使用的上下文环境跟表达式E
一样,同时表示的意义也是一样,除非另有说明。id-expression: unqualified-id qualified-id
一个id-expression
是一个受限形式的primary-expression
。[Note: 一个id-expression
可以出现在.
和->
运算符的后面。]
如如一个id-expression
被用作指示一个类类型的非静态数据成员或者非静态函数成员,那么它只能按照下面的方式进行使用:
id-expression
指示了一个非静态的数据成员并且用在了非求值的操作数表达式中。例子说明:
class S
{
int m;
};
int i = sizeof(S::m); // OK
int j = sizeof(S::m + 42); // OK
如果一个id-expression
表达式指示的是一个概念类型(concept
)的特殊化,并且那个概念类型的结果是一个分类的值类型是bool
类型的prvalue
分类。那么表达式为true
,如果指定的模板类型实参满足了概念的constraint-expression
,否则表达式的结果是false
。
例子说明:
template<typename T> concept C = true;
static_assert(C<int>); // OK
[Note: 概念限制在使用一个模板名字,函数重载的选择并且这些他们在一个限制的半序排序中被比较。(17.4.4
)]
如果一个程序显式或者隐式的引用一个尾部具有requires-clause
分句的函数,并且其限制没有被满足,那么除了声明这个函数,其他任何使用,程序都是不符合规范的。
例子说明:
void f(int) requires false;
void g() {
f(0); // error: cannot call f
void (*p1)(int) = f; // error: cannot take the address of f
decltype(f)* p2 = nullptr; // error: the type decltype(f) is invalid
}
在每一种情况中函数f
的限制都没有被满足,在声明p2
中,尽管是用在非求值的操作数中,函数f
的这些限制也是会被考虑。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。