复制构造方法的用法?
the usage of copy-constructor method?
在我的代码中,我使用 inner-class 作为另一个 class.
的迭代器
为了简化情况,代码可以如下所示:
class A {
public:
class B {
public:
explicit B(void):idx(3){}
B(const B&b) {
idx = 4; // never be called
}
private:
int idx=0;
};
B getB()
{ return A::B(); }
};
void test2(){
A a;
A::B b = a.getB(); // b.idx ends with value of 3
}
问题是,在 test2()
中,在 运行 A::B b = a.getB();
中,没有调用复制构造函数方法。 b
以值 3
结尾。
这是为什么?
另一个问题让我很困惑
class A {
public:
class B {
public:
explicit B(void):idx(3){}
explicit B(const B&b) {} // C2440, cannot convert from "A::B" to "A::B"
private:
int idx=0;
};
B getB()
{ return A::B(); }
};
为什么C2440会出现完全一样的两种型号?
您现在看到的是 copy elision。为了让优化器更容易加速生成的代码,C++标准允许在某些情况下跳过复制构造函数。
C++ 语言不保证在抽象机中可以观察到复制(或移动)构造函数的副作用。这 non-guarantee 让编译器在不需要时避免使用临时对象,从而避免在具体机器中复制这些对象。
您的程序依赖于复制构造函数的副作用。这是不好的;别这样。
在我的代码中,我使用 inner-class 作为另一个 class.
的迭代器为了简化情况,代码可以如下所示:
class A {
public:
class B {
public:
explicit B(void):idx(3){}
B(const B&b) {
idx = 4; // never be called
}
private:
int idx=0;
};
B getB()
{ return A::B(); }
};
void test2(){
A a;
A::B b = a.getB(); // b.idx ends with value of 3
}
问题是,在 test2()
中,在 运行 A::B b = a.getB();
中,没有调用复制构造函数方法。 b
以值 3
结尾。
这是为什么?
另一个问题让我很困惑
class A {
public:
class B {
public:
explicit B(void):idx(3){}
explicit B(const B&b) {} // C2440, cannot convert from "A::B" to "A::B"
private:
int idx=0;
};
B getB()
{ return A::B(); }
};
为什么C2440会出现完全一样的两种型号?
您现在看到的是 copy elision。为了让优化器更容易加速生成的代码,C++标准允许在某些情况下跳过复制构造函数。
C++ 语言不保证在抽象机中可以观察到复制(或移动)构造函数的副作用。这 non-guarantee 让编译器在不需要时避免使用临时对象,从而避免在具体机器中复制这些对象。
您的程序依赖于复制构造函数的副作用。这是不好的;别这样。