C++类名作为类成员

4
在下面的代码中,main 函数中的后缀表达式 AttrNode().AttrNode 的含义是什么?gcc 和 clang 都能够编译该代码而不出现任何错误。看起来这在 C++ 标准中是合法的。但是这样的代码有什么意义?为什么 C++ 标准允许这种用法?请注意保留 HTML 格式标记。
#include <stdio.h>

struct AttrNode {
public:
     AttrNode() {}
     static void make() {}
};

int main() {
    AttrNode().AttrNode::make();
    return 0;
}

谢谢!


多么奇怪的代码!毫无理由地创建一个临时实例,并毫无理由地限定函数名称。只应该做其中之一,而肯定不是前者! - Lightness Races in Orbit
1个回答

8

AttrNode::是用来限定名称make的,以显式调用AttrNode::make而不是任何其他名为make的函数。

在这种情况下,这是多余的;AttrNode().make()将完全执行相同的操作:创建临时对象,调用函数,然后销毁对象。由于它是静态函数,通常可以在不创建对象的情况下调用它,即AttrNode::make()

如果它是虚函数,则会导致在指定类中进行非虚拟调用,而不是最终覆盖的虚拟调用。该语法也可用于访问在派生类中隐藏的基类中的名称。


需要提到的一件事是,调用静态函数时是否创建对象会影响对象的创建效果。当然,在这个例子中没有任何区别。 - writalnaie
1
@writalnaie:好的,我稍微让它更清晰了。发布的代码创建了一个(可能不需要的)对象,而常规的静态函数调用则没有。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接