В общем, пометка некоторой переменной как rvalue reference
с &&
не означает, что она сохраняет этот статус при прохождении src
дальше. Я имею в виду, в конце концов, переменная имеет имя в контексте конструктора и поэтому может, очевидно, использоваться как lvalue
. На самом деле выражение src
действительно является lvalue
. src
передается вашему конструктору как rvalue
, потому что вызывающая сторона намеревалась интерпретировать его как таковой.
Теперь в вашем конструкторе переменная фактически названа, и использование этого имени приводит к выражению, которое необходимо явно пометить как rvalue reference
, чтобы интерпретировать как таковое. В противном случае, это просто значение. Вот почему вы должны move
снова его интерпретировать вызываемым абонентом (здесь MyMovingBase::ctor
) как rvalue
, содержимое которого может быть перемещено из исходного объекта.
Subclass(Subclass &&src) : MyMovingBase<SubClass>(std::move(src))
делает свое дело.
Для получения доступа к маркировкам "Col1" и "Col2" можно использовать следующее:
=INDEX (1$: 1,1$, СТОЛБЕЦ () - MOD (СТОЛБЕЦ ()-1,2))
Примечание: Это предполагает, что Вы группируетесь то же количество ячеек. Если бы это были три ячейки, то Вы просто изменили бы последнее число в формуле к 3 и так далее.
Править: Вот то, как это работает:
ИНДЕКС (1$: 1,1$, x) возвращает значение ячейки последовательно 1, столбец x. Если Ваша таблица на самом деле не расположена в верхнем левом углу рабочего листа, можно изменить это на фактический диапазон, который включает все объединенные маркировки. В этом случае это было бы: ИНДЕКС (1$A$: 1,1$D$, x)
СТОЛБЕЦ () возвращает номер столбца текущей ячейки (1 в столбце A, 2 в столбце B, и т.д.)
MOD (СТОЛБЕЦ ()-1, x) возвращает смещение от текущего столбца до столбца, который содержит надлежащую маркировку
Ячейки B1 и D2 не содержат значений, только A1 и C1, имеют что-то в них.
Таким образом, необходимо будет просто удостовериться, что формулы в столбцах A и B и называют A1 справочным значением, и что формулы в столбцах C и D оба относятся к C1 для справочного значения.
Я создал простую функцию в vba, которая решит эту проблему:
Function mergedText(rngMergedCell As Range)
If rngMergedCell.MergeCells = True Then
mergedText = rngMergedCell.MergeArea(1, 1)
Else
mergedText = rngMergedCell
End If
End Function
Если ячейка является объединенной ячейкой, функция вернет значение в первом элементе объединенной ячейки - здесь объединенная ячейка хранит свое значение