为什么这个代码可以消除副本
Why can this code elide a copy?
可能的重复:
构造函数调用机制
为什么使用一组空的括号来调用没有参数的构造函数是错误的?
为什么这个代码可以消除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下也不输出任何内容。
问题不是复制省略,而是声明的含义:
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++常见问题小册子中的更多内容,包括解决方法。
[1]:这与完全不同,因为这需要从A
到B
的隐式转换。如果B
定义为:
class B {
A a;
public:
explicit B(const A& a_) : a(a_) {}
};
那么这将不是一个替代方案。
B b(A());
你认为这声明了一个变量吗?编号
它声明一个返回类型为B
的函数b
,并接受一个A (*)()
类型的参数。
请参阅本主题:
- 最令人烦恼的解析:为什么不;t A A((((;工作
因此,如果您想声明一个变量,请在A()
周围加一个大括号作为:
B b((A())); //it declares an object
使用:
B b((A()));
您的行是一个函数声明。不幸的是,C允许函数内部的函数声明(BTW对我来说似乎很无用(,所以出于向后兼容性的原因,C++允许这样做。你可以用额外的括号强制变量定义。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 用于制作文件副本的代码
- 该代码调用副本或移动构造函数
- C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中
- 使用矢量push_back代码创建对象副本时遇到问题
- 内联函数,始终 n+1 个代码副本,其中'n'是调用次数
- 我的代码正在制作 2D 数组元素的重复副本.代码中有什么问题?
- NewDirectByteBuffer是否在本机代码中创建副本
- 这段带有副本C++08的代码出错
- 我的代码是在创建对象的深层副本还是浅层副本
- 这段代码创建了多少个变量C的副本
- 避免在内存中创建多个代码副本
- 此代码将执行多少个副本
- 为什么这个代码可以消除副本
- 在汇编代码中查找不必要的缓冲区副本