Что означают квалификаторы функций-членов (кроме const)?

Общеизвестно, что методы класса могут быть квалифицированы с const - и если они есть, им не разрешено изменять экземпляр, к которому они обращаются (игнорируя mutable так далее). Можно думать об этом, как будто функция-член была автономной, но получая this указатель в качестве первого параметра - который будет const MyClass* для const метод и MyClass в противном случае.

Недавно я узнал, что на самом деле существуют дополнительные возможные квалификаторы для функций-членов (см., Например, этот вопрос на сайте), поэтому квалификаторы:

  • const или неконстантный
  • volatile или нелетучий
  • без ссылок, регулярные ссылки (&) или rvalue-ссылка (&&)

Около volatileЯ знаю, что это значит для переменных - вы не можете просто сделать копию (например, в регистре или, возможно, в каком-то некогерентном кэше) и ожидать, что она будет действительной, так как другой код может изменить исходное местоположение. Похоже, это не относится кthis метафора указателя "как const Модификатор, так как - это указатель, конечно, другие могут изменять указываемые данные. Я бы лучше понял что-то вроде __restrict__ классификатор наthis, Итак, это volatile что я предполагаю, или я неправильно истолковываю?

Теперь о ссылочных квалификаторах для участников - я не в курсе. Что бы это вообще значило? Что будет ссылкой на что? Я не понимаю

1 ответ

Ключевое слово volatile эффективно указывает компилятору воздерживаться от любых допущений, которые он обычно делает, чтобы оптимизировать сгенерированные инструкции на ассемблере для работы с конкретной переменной.

Спецификаторы ссылок используются для того, чтобы этот метод вызывался только тогда, когда вызываемый объект является ссылкой lvalue (для &) или ссылкой rvalue (для &&) соответственно. Это помогает, если вы хотите изменить поведение вашего метода на основе lvalueness / rvalueness объектов (например, учитывая, что значения r обычно являются кратковременными временными значениями).

Другие вопросы по тегам