Вектор пары с постоянным членом - PullRequest
9 голосов
/ 18 марта 2019

Как указано в , этот ответ a std::vector<T> не может содержать const T или классов с const -членами. Однако это не тот случай, когда T = std::pair<const int, int>, как показано ниже. Почему это так? Какое std::pair особенное?

#include <utility>
#include <vector>

struct foo
{
    const int first;
    int second;
};

int main() {
    std::vector<std::pair<const int, int>> V1;
    V1.resize(3); // This compiles

    std::vector<foo> V2;
    V2.resize(3); // This gives the error listed below
}

ошибка: использование удаленной функции 'foo :: foo ()'

примечание: 'foo :: foo ()' неявно удаляется, поскольку определение по умолчанию будет некорректно сформировано:

1 Ответ

18 голосов
/ 18 марта 2019

Вы смешиваете две вещи здесь. Полученная ошибка связана с неявно удаленным конструктором foo() по умолчанию, который std::vector::resize(size_type count) вызывает:

Если текущий размер меньше count,
1) добавлены дополнительные вставленные по умолчанию элементы

Шаблон std::pair имеет конструктор по умолчанию, поэтому вызов V1.resize завершается успешно. Если вы также предоставите один для foo или разрешите его неявную генерацию посредством инициализации класса, например,

struct foo
{
    const int first = 42;
    int second = 43;
};

тогда

std::vector<foo> V2;
V2.resize(3);

с радостью скомпилирует. Операция, которая не сработает как для std::pair<const int, int>, так и foo, это назначение . Это не скомпилируется:

V1[0] = std::pair<const int, int>(42, 43); // No way
V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member

, который не имеет ничего общего с std::vector, но с const -квалифицированными членами данных в обоих случаях.

...