Поведение Smart Pointer с использованием * - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующий фрагмент кода:

QList<const GLMeshPtr*> meshList;
m_itemsList->getSelectedMeshes(meshList);

for (auto m : meshList)
{
    if (GLBodyPtr c = (*m)->getStandard()) {
        c->executeMeshFix();
    }
}

GLMeshPtr установлено как в этом typedef:

typedef std::shared_ptr<GLMesh> GLMeshPtr;

Определение m_itemsList->getSelectedMeshes:

void QMeshList::getSelectedMeshes(QList<const GLMeshPtr*>& list)
{
    for (auto& m : m_meshList) {
        if (m->isSelected()) {
            list.push_back(m->getGLMesh());
        }
    }
}

Определение для getGLMesh:

const GLMeshPtr* getGLMesh() const { return &m_glmesh; } // where m_glmesh is a GLMeshPtr.

Мой вопрос очень прост, но я не смог найти на него никакой ссылки. Создает ли ключевое слово * копию значения в стеке, обязательно, или оно использует значение «на месте»?

Я более конкретно говорю об этой строке:

if (GLBodyPtr c = (*m)->getStandard()) {

Создаю ли я ненужные копии GLBodyPtr? Я не хочу, чтобы кто-то здесь разделял указатель.

1 Ответ

0 голосов
/ 02 июля 2018

Нет, оператор * возвращает ссылку, т.е. GLBodyPtr const&. Это const, потому что указатель объявлен для указания на const-объект. См. Определение std::shared_ptr::operator* на cppreference.com .

Ссылки в основном похожи на указатели, которые нельзя изменить после инициализации, поэтому это не копия объекта shared_ptr.

...