Что означают квалификаторы функций-членов (кроме const)?
Общеизвестно, что методы класса могут быть квалифицированы с const
- и если они есть, им не разрешено изменять экземпляр, к которому они обращаются (игнорируя mutable
так далее). Можно думать об этом, как будто функция-член была автономной, но получая this
указатель в качестве первого параметра - который будет const MyClass*
для const
метод и MyClass
в противном случае.
Недавно я узнал, что на самом деле существуют дополнительные возможные квалификаторы для функций-членов (см., Например, этот вопрос на сайте), поэтому квалификаторы:
const
или неконстантныйvolatile
или нелетучий- без ссылок, регулярные ссылки (
&
) или rvalue-ссылка (&&
)
Около volatile
Я знаю, что это значит для переменных - вы не можете просто сделать копию (например, в регистре или, возможно, в каком-то некогерентном кэше) и ожидать, что она будет действительной, так как другой код может изменить исходное местоположение. Похоже, это не относится кthis
метафора указателя "как const
Модификатор, так как - это указатель, конечно, другие могут изменять указываемые данные. Я бы лучше понял что-то вроде __restrict__
классификатор наthis
, Итак, это volatile
что я предполагаю, или я неправильно истолковываю?
Теперь о ссылочных квалификаторах для участников - я не в курсе. Что бы это вообще значило? Что будет ссылкой на что? Я не понимаю
1 ответ
Ключевое слово volatile эффективно указывает компилятору воздерживаться от любых допущений, которые он обычно делает, чтобы оптимизировать сгенерированные инструкции на ассемблере для работы с конкретной переменной.
Спецификаторы ссылок используются для того, чтобы этот метод вызывался только тогда, когда вызываемый объект является ссылкой lvalue (для &) или ссылкой rvalue (для &&) соответственно. Это помогает, если вы хотите изменить поведение вашего метода на основе lvalueness / rvalueness объектов (например, учитывая, что значения r обычно являются кратковременными временными значениями).