- Могу ли я вызвать src.get () после std :: move (src)
Если мы остаемся агностиком в отношении типа src
, тогда мы не знаем. Потенциально нет. Есть случаи, когда вызов функции-члена после перемещения будет неопределенным. Например, вызывая оператор косвенности умного указателя.
Учитывая определение decltype(src)
и его функций-членов, которые вы показали, мы знаем: да, вам разрешено.
- Могу ли я предположить, что src.get () возвращает 0 после std :: move.
Если мы остаемся агностиком в отношении типа src
, мы ничего не знаем о том, что делает src.get()
. Точнее, мы не знаем его предпосылок.
Учитывая приведенное вами определение decltype(src)
и его функций-членов: Да, мы можем сделать предположение.
- Если 1. и 2. действительны, то есть способ изменить код, чтобы clan-tidy знал, что это верно. А если нет, то есть ли способ изменить код, чтобы он действовал?
Clang-tidy предполагает, что «отсутствие в перемещенном состоянии» является предварительным условием для всех функций-членов (кроме назначения), и согласно этому предположению предупреждает, что такое предполагаемое предварительное условие нарушается. Как таковой, он пытается обеспечить соблюдение соглашения, чтобы всегда принимать такой предварительный код, даже если вы знаете, что он не существует для вашего класса.
Вы можете удалить вызов на src.get()
между переездом и переназначением src
. Одна операция над перемещенной переменной, на которую clang-tidy не жалуется, - это переназначение, и после этого присваивания состояние объекта должно (условно) быть хорошо определенным, и вызов других функций-членов считается нормальным (конечно, , у вас могут быть другие предварительные условия, которые должны быть выполнены, но Clang-Tidy, вероятно, не знает о них). Хотя технически можно было бы определить тип, для которого даже назначение после перемещения не является четко определенным, но такой тип был бы весьма нетрадиционным и небезопасным.
В заключение, вы можете позвонить src.get()
после перемещения (даже до переназначения) для этого конкретного класса, но тогда вы не будете следовать соглашению, которое пытается выполнить clang-tidy.