Мошенничество - PullRequest
       6

Мошенничество

0 голосов
/ 14 апреля 2020

Я обнаружил странное (по крайней мере для меня) поведение, которое в следующем коде функция B::Compute() const изменяет неконстантный член. Я думал, что это было запрещено, тем более что я не собирался обманывать константность, например, через const_cast или тому подобное. Тем не менее, код компилируется (подробности см. Ниже) . Почему это так?

#include <vector>
#include <iostream>

class A {
    std::vector<int> v_;
public: 
    void AddToA( int const e ) {
        v_.push_back( e );
    }

    void Print() const { 
        for( auto const& v : v_ ) {
            std::cout << v << "\t";
        }
        std::cout << "\n";
    }
};

class B {
    A & a_;
public:  
    void Compute() const {
        a_.AddToA( 1 );
    }
};
int main() {
    A a = A(); 
    B b = B( a );

    B b2 = B( a );

    b.Compute();
    a.Print();

    b2.Compute();
    a.Print();

    return 0;
}

Редактировать:

Как указывалось мне, мои подробности компиляции были бессмысленными. Поэтому я удалил их.

1 Ответ

4 голосов
/ 14 апреля 2020

Допустимо модифицировать объект, на который a_ ссылается из b.Compute(), потому что вы не модифицируете a_. Создание функции-члена const означает, что вы не можете изменять значения, хранящиеся в переменных-членах, но это уже невозможно с ссылками (которые никогда нельзя изменить для ссылки на новые объекты).

Ваша ошибка компиляции без флага C ++ 17 не имеет ничего общего с константностью. Прочитайте сообщения об ошибках; они говорят вам, что вы пытаетесь вызвать удаленные конструкторы перемещения / копирования из вашей функции InstantiateA(), что недопустимо без функции отложенной материализации в C ++ 17.

Скорее всего, у вас выучили все это самостоятельно, если бы вам пришлось собрать минимальный пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...