为什么这段代码可以删除副本?

发布于 2024-11-20 00:17:20 字数 748 浏览 1 评论 0原文

可能的重复:
构造函数调用机制
为什么使用空括号调用不带参数的构造函数会出错?

为什么可以这样 代码 删除 A 的所有副本吗?

#include <iostream>

class A
{
public:
  A() {}
  A(const A&) { std::cout << "Copy" << std::endl; }
};

class B
{
public:
  B(const A& a_) : a(a_) {}
private:
  A a;
};

int main()
{
  B b(A());
}

这段代码显然没有复制 A,并且在 ideone 的 gcc 3.4 下不输出任何内容。

Possible Duplicates:
constructor invocation mechanism
Why is it an error to use an empty set of brackets to call a constructor with no arguments?

Why can this code elide all copies of A?

#include <iostream>

class A
{
public:
  A() {}
  A(const A&) { std::cout << "Copy" << std::endl; }
};

class B
{
public:
  B(const A& a_) : a(a_) {}
private:
  A a;
};

int main()
{
  B b(A());
}

This code apparently makes no copies of A, and outputs nothing under gcc 3.4 at ideone.

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

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

发布评论

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

评论(3

三生殊途 2024-11-27 00:17:20

问题不在于复制省略,而在于声明的含义:

B b(A());
// To get it working the way you expect [1]
B b = B(A());
// Or the slightly more obtuse.
B b((A()));

对于编译器来说是一个函数声明。谷歌/搜索SO最令人烦恼的解析。 C++ FAQ lite 中提供更多信息,包括解决方法。


[1]:这并不完全一样,因为这需要从 A隐式转换 >B。如果 B 定义为:

class B {
  A a;
public:
  explicit B(const A& a_) : a(a_) {}
};

那么这将不是一个替代方案。

The problem is not copy elision, but the meaning of the declaration:

B b(A());
// To get it working the way you expect [1]
B b = B(A());
// Or the slightly more obtuse.
B b((A()));

To the compiler is a function declaration. Google / search SO for the most-vexing-parse. More in the C++ FAQ lite including workarounds.


[1]: This is not exactly the same, as this requires an implicit conversion from A to B. If B was defined as:

class B {
  A a;
public:
  explicit B(const A& a_) : a(a_) {}
};

Then this would not be an alternative.

怀中猫帐中妖 2024-11-27 00:17:20
B b(A());

你认为这声明了一个变量?不。

它声明了一个函数 b ,其返回类型为 B 并接受类型为 A (*)() 的参数。

请参阅此主题:


因此,如果您想声明一个变量,请在 A() 周围放置一个额外的大括号,如下所示:

B b((A())); //it declares an object
B b(A());

You think this declares a variable? No.

It declares a function b whose return type is B and accepts a parameter of type A (*)() .

See this topic:


So if you want to declare a variable, put an extra braces around A() as:

B b((A())); //it declares an object
等待我真够勒 2024-11-27 00:17:20

使用:

B b((A()));

您的行是函数声明。不幸的是,C 允许在函数内部声明函数(顺便说一句,这对我来说似乎毫无用处),因此出于向后兼容性的原因,C++ 允许这样做。您可以使用额外的括号强制变量定义。

Use:

B b((A()));

your line is a function declaration. Unfortunately C allowed function declarations inside functions (which BTW seem pretty useless to me), so for backward compatibility reasons C++ allows this to. You can enforce variable definition with extra parentheses.

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