首页 > 解决方案 > 复制构造方法的使用?

问题描述

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

为了简化情况,代码可以如下所示:

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以 value 结尾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会出现两种完全相同的类型?

标签: c++inner-classes

解决方案


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


推荐阅读