在§13.3.1/4(N3337)中,您会发现以下内容:
对于静态成员函数,隐式对象参数被认为与任何对象匹配(因为如果选择了函数,则丢弃对象)。
§9.4.1/2有这样一种说法:
静态成员函数没有this指针。
那么,静态成员函数的隐式对象参数的用途是什么?
下面是来自标准的描述,这意味着隐式对象参数用于重载目的。
在重载解析开始之前,将通过名称查找和模板参数推断选择的函数组合在一起,以形成候选函数集(确切的条件取决于重载解析发生的上下文)。
如果任何候选函数是成员函数(静态或非静态),但不是构造函数,则将其视为具有一个额外参数(隐式对象参数),该参数表示为其调用的对象,并显示在第一个实际参数之前。
类似地,正在调用成员函数的对象作为隐含对象参数前置到参数列表中
对于类X的成员函数,隐式对象参数的类型受成员函数的cv限定和ref限定的影响。
对于静态成员函数,隐式对象参数被视为匹配任何对象:不检查其类型,也不尝试对其进行转换序列。
它用于使过载解析更容易理解。
struct S {
void f(int);
static void f(double);
};
int main() {
S::f(1);
}
这里,s::f(1);
只是一个硬错误,因为f(int)
比f(Double)
更匹配,即使f(int)
重载会导致进一步的硬错误。
如果规则是其他方式,请考虑会发生什么:
template <typename T>
struct U : S {
void u() {
S::f(1);
}
};
template <typename T>
struct V : U<T> {
void v() {
S::f(1);
}
};
在这里,U::U显然是有效的,并调用成员函数<代码>V
给定一个简单的异步函数: 编译器抱怨说< code>async fn必须重写才能返回装箱的< code>dyn Future。 编译器解释(): 要实现异步递归,需要对 进行解加,以便在返回类型中显式显示 : 最后,未来被包裹在一个钉着的盒子里:
本文向大家介绍什么是C#中的静态成员函数?,包括了什么是C#中的静态成员函数?的使用技巧和注意事项,需要的朋友参考一下 静态函数只能访问静态变量。静态函数甚至在创建对象之前就已存在。 将静态函数设置为- 以下是演示静态函数用法的示例- 示例 输出结果
这是有效代码: 但是在这里,我真的很想声明和 。但是为什么呢?
在类中,static 除了可以声明 静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。 编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 th
我目前正在学习打字稿,我遇到了一个对我来说不太有意义的错误。 以下函数有一个对象作为参数 还有一个具有两种泛型类型的。 现在,我创建了一个名为的对象,它接受一个对象和一个字符串。 当我调用函数<code>addId</code>时,它抛出以下错误:<code>Generic type‘UserInterface 我不明白为什么我会有这个错误,因为< code>user对象有< code>name
本文向大家介绍C++中静态成员函数与静态成员变量(static ),包括了C++中静态成员函数与静态成员变量(static )的使用技巧和注意事项,需要的朋友参考一下 C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习C语言的stati