复制构造方法的用法?

时间:2019-06-04 10:52:49

标签: c++ inner-classes

在我的代码中,我将内部类用作另一个类的迭代器。

为简化这种情况,代码可以显示如下:

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();时未调用copy-constructor方法。 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的两种类型会完全相同?

2 个答案:

答案 0 :(得分:8)

您看到的是copy elision。为了使优化器更容易加速生成的代码,C ++标准允许在某些情况下跳过复制构造函数。

答案 1 :(得分:4)

C ++语言不能保证在抽象机器中可以观察到复制(也不能移动)构造函数的副作用。这种非保证性使编译器可以在不需要临时对象时避免使用它们,从而避免了将这些对象复制到具体机器中。

您的程序依赖于复制构造函数的副作用。这是不好的;不要这样做。