复制构造方法的用法?

Lai*_*ine 3 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
}
Run Code Online (Sandbox Code Playgroud)

问题在于,在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();  }
};
Run Code Online (Sandbox Code Playgroud)

为什么两种类型的C2440会完全相同?

小智 8

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