использование метода copy-constructor? - PullRequest
3 голосов
/ 04 июня 2019

В своем коде я использовал inner-класс в качестве итератора для другого класса.

Чтобы упростить ситуацию, код можно отобразить следующим образом:

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 встречается с двумя типами абсолютно одинаково?

Ответы [ 2 ]

8 голосов
/ 04 июня 2019

То, что вы видите, это copy elision .Чтобы оптимизаторам было проще ускорить сгенерированный код, стандарт C ++ позволяет пропускать конструкторы копирования в определенных ситуациях.

4 голосов
/ 04 июня 2019

Язык C ++ не гарантирует, что побочные эффекты конструкторов копирования (или перемещения) будут наблюдаться в абстрактной машине. Эта негарантированная позволяет компилятору избегать временных объектов, когда они не нужны, тем самым избегая копирования этих объектов на конкретную машину.

Ваша программа использует побочные эффекты конструктора копирования. Это плохо; Не делай этого.

...