Переместите конструкторы и `std :: array`

Метод 1

Здесь можно использовать функцию фокусировки в пределах . Но :focus-within не поддерживает IE.

См. Список поддержки браузера.

Метод 2

.test input {
  padding-left: 2em;
  padding-top: 1em;
  padding-bottom: 1em;
}

.test input:focus,
.test input:focus + label {
  color: green;
}

.test label {
  display: block;
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  left: 10px;
  z-index: 1;
}

.test {
  position: relative;
  background-color: #dedede;
  display: inline;
}

Метод 3

Когда вам нужно поработать над " : перед "селектором;

.test input {
  padding-left: 2em;
  padding-top: 1em;
  padding-bottom: 1em;
}

.test input:focus,
.test input:focus + label {
  color: green;
}

.test label:before {
  display: block;
  content: ' 

; position: absolute; top: 50%; transform: translateY(-50%); left: 10px; z-index: 1; } .test { position: relative; background-color: #dedede; display: inline; }

23
задан 17.05.2020, 12:14

2 ответа

Однако, что это действительно означает?

Это означает, что, если тип элемента является подвижным, то и тип массива.

std::array<movable, 42> move_from = {...};
std::array<movable, 42> move_to = std::move(move_from); // moves all the elements

Я склонен представлять этот тип как более безопасную версию массива с интерфейсом, совместимым с STL

Не совсем. Это оболочка для массива, обеспечивающая семантику, аналогичную агрегатному классу, включая возможность его копирования и перемещения.

Как std::array может двигать-конструировать свои элементы?

Точно так же, как и любой другой агрегат. Его неявный move-constructor будет перемещать-конструировать все его элементы, включая элементы любых массивов элементов.

Можно ли сделать то же самое с обычным массивом?

Только если вы оберните его в тип класса, как это делает std::array.

26
ответ дан 17.05.2020, 12:14
  • 1
    " Только если Вы обертываете его в класс type" , Таким образом, это - факт это it' s пользовательский тип, что позволяет это поведение... Интересный. –  17.05.2020, 12:14
  • 2
    @faranwath: Действительно - а именно, то, что пользовательские составные типы неявно генерировали конструкторов перемещения. – Mike Seymour 17.05.2020, 12:15

Конструктор перемещения по умолчанию для класса (без объединения) выполняет перемещение по элементам. Перемещение элемента данных необработанного массива означает перемещение каждого из элементов массива, см. [Class.copy] / 15.

Следовательно, вы можете переместить необработанный массив, поместив его в класс:

struct wrap
{
    std::string arr[25];
};

auto w = wrap();
auto m = std::move(w); // moves the 25 `std::string`s

Вы также можете вручную вызвать конструктор перемещения элементов, например:

std::string a[3] = { /*...*/ };
std::string b[3] = {std::move(a[0]), std::move(a[1]), std::move(a[2])};

Не указывается, если std::array содержит необработанный массив. Однако он содержит элементы данных из value_type, поскольку он гарантированно является совокупным. Эти элементы данных будут перемещены, как описано выше, при вызове конструктора перемещения.

Если элементы данных std::array не являются MoveConstructible, создание экземпляра его конструктора перемещения завершится неудачей.

7
ответ дан 17.05.2020, 12:15
  • 1
    " Поэтому можно переместить необработанный массив путем помещения его в class" на то же указал Mike Seymour, я wasn' t знающий о нем - хотя теперь, когда я думаю об этом, имеет смысл. –  17.05.2020, 12:16

Теги

Похожие вопросы