C++ 中可以将匿名对象声明为静态吗?

发布于 2024-07-10 15:07:58 字数 197 浏览 13 评论 0原文

这是允许的吗? :

class A;
void foo()
{
    static A();
}

当我尝试这样做时,我收到信号 11,但以下工作正常:

class A;
void foo()
{
    static A a;
}

谢谢。

Is this allowed? :

class A;
void foo()
{
    static A();
}

I get signal 11 when I try to do it, but the following works fine:

class A;
void foo()
{
    static A a;
}

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夏有森光若流苏 2024-07-17 15:07:58

没有。 C++ 中不存在“匿名对象”这样的东西。 存在这样一种情况,即定义一个类型为 A 的对象会立即被丢弃; 您编写的是一个返回 A 对象的表达式,该对象从未分配给变量,就像 printf 的返回码通常从未分配或使用一样。

在该代码中,如果它有效,您将声明“没有对象”在堆外分配。 由于没有要分配的对象,因此它没有意义。

Nope. There is no such thing as an "anonymous object" in C++. There is such a thing as defining an object to type A that is immediately discarded; what you've written is an expression that returns an A object that's never assigned to a variable, like the return code of printf usually is never assigned or used.

In that code, if it worked, you'd be declaring "no object" to be allocated outside the heap. Since there's no object to allocate, it's meaningless.

维持三分热 2024-07-17 15:07:58

您可以创建“匿名”自动变量,但不能创建静态变量。 下面将创建一个类 A 的对象并调用构造函数,然后在函数退出时调用析构函数。

class A;
void foo()
{
    A();
}

您可以通过在堆上分配对象或在预先分配的位置就地构建它来获得类似的效果。

void foo()
{
    new A();
}

void foo()
{
    static char memory[sizeof (A)];
    new (memory) A();
}

但是,在这两种情况下,都无法正确清理对象,因为没有为以后调用删除保留指针。 即使静态内存将被释放,析构函数也永远不会被调用。 匿名对象只有在与垃圾收集器一起使用时才会真正产生。

You can create an "anonymous" automatic variable, but not a static one. The following would create an object of class A and call the constructor and then call the destructor on function exit.

class A;
void foo()
{
    A();
}

You could get a similar effect by allocating the object on the heap or constructing it in place in a preallocated location.

void foo()
{
    new A();
}

void foo()
{
    static char memory[sizeof (A)];
    new (memory) A();
}

However, in both cases the object cannot be cleaned up correctly since a pointer is not held for a later call to delete. Even though the static memory will be released the destructor will never be called. Anonymous objects only really make since when used with a garbage collector.

微凉 2024-07-17 15:07:58

不知何故,我认为这家伙是在追求单例构造函数的副作用。

不管怎样,只要给这个该死的东西一个变量名就可以了。

Somehow, I think this guy's after a singleton constructor side effect.

Anyway, just give the darn thing a variable name already.

世界等同你 2024-07-17 15:07:58

当然,C++ 中有匿名对象!
A(100) 是本示例中的匿名对象

但是,如果您考虑一下,创建 static 是没有意义的匿名对象。

Of course there are anonymous objects in C++ !
A(100) is anonymous object in this sample

However if you think about it, it makes no sense to create static anonymous object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文