为什么这段代码可以删除副本?
为什么可以这样 代码 删除 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
问题不在于复制省略,而在于声明的含义:
对于编译器来说是一个函数声明。谷歌/搜索SO最令人烦恼的解析。 C++ FAQ lite 中提供更多信息,包括解决方法。
[1]:这并不完全一样,因为这需要从
A
到的隐式转换 >B。如果
B
定义为:那么这将不是一个替代方案。
The problem is not copy elision, but the meaning of the declaration:
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
toB
. IfB
was defined as:Then this would not be an alternative.
你认为这声明了一个变量?不。
它声明了一个函数
b
,其返回类型为B
并接受类型为A (*)()
的参数。请参阅此主题:
因此,如果您想声明一个变量,请在
A()
周围放置一个额外的大括号,如下所示:You think this declares a variable? No.
It declares a function
b
whose return type isB
and accepts a parameter of typeA (*)()
.See this topic:
So if you want to declare a variable, put an extra braces around
A()
as:使用:
您的行是函数声明。不幸的是,C 允许在函数内部声明函数(顺便说一句,这对我来说似乎毫无用处),因此出于向后兼容性的原因,C++ 允许这样做。您可以使用额外的括号强制变量定义。
Use:
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.