Daily bit(e) C++. cv- и ref-квалифицированные функции-члены

Добавлено 12 августа 2026 в 08:37

Daily bit(e) C++ 69, добавление квалификаторов const/volatile и ссылки (reference) к функциям-членам.

Daily bit(e) C++

Функции-члены в C++ могут быть cv-квалифицированы, что позволяет вызывать функцию-член для объекта с соответствующими cv-квалификаторами.

Функции-члены также могут быть ref-квалифицированы, чтобы различать вызов для lvalue-объекта или rvalue-объекта.

Предоставление полного набора методов с квалификаторами cv и ref может привести к большому дублированию, которое можно устранить с помощью функции C++23 «явный параметр объекта» / «вывод this».

#include <utility>
#include <print>

struct Qualified 
{
    void operation() { /* без квалификаторов */ }
    void operation() const { /* const */ }
    void operation() volatile { /* volatile */ }
    void operation() const volatile { /* const + volatile */ }
};

struct MyClass 
{
    void operation() & { /* изменяемое lvalue */ }
    void operation() && { /* rvalue: prvalue или xvalue */ }
    void operation() const& { /* неизменяемое lvalue */ }
    // комбинации с volatile и const&& также возможны
};


Qualified x;
x.operation(); // без квалификаторов

std::as_const(x).operation(); // const

volatile Qualified y;
y.operation(); // volatile

std::as_const(y).operation(); // const + volatile


MyClass a;
a.operation(); // изменяемое lvalue

std::as_const(a).operation(); // const

MyClass{}.operation(); // prvalue

std::move(a).operation(); // xvalue

Пример на Compiler Explorer

Теги

C++ / CppC++23Daily bit(e) C++Программирование