Информация об изменениях

Сообщение Re[8]: Про красивость работы с std::vector от 15.03.2025 12:34

Изменено 15.03.2025 12:41 rg45

Re[8]: Про красивость работы с std::vector
Здравствуйте, T4r4sB, Вы писали:

TB>Я имею в виду такой вариант: https://godbolt.org/z/5q55ofhaj

TB>а вот ставить && при объявлении переменных это шиза конечно

Ну так и в этом варианте не RVO, а перемещение, что и видно по выхлопу.

Вот RVO:

https://godbolt.org/z/ee51sTeez

#include <vector>
#include <cstdint>
#include <cstring>
#include <cstdio>

struct T {
    int value{};

    explicit T(int value) : value(value) { printf("T(%d)\n", value);}
    ~T() { printf("~T(%d)\n", value);}

    T(const T&) = delete;
    T(T&&) = delete;
    T& operator=(const T&) = delete;
    T& operator=(T&&) = delete;
};

T takeData(int value)
{
    return T(value);
}

int main() {
    auto t = takeData(42);
}


С практической точки зрения гарантированное RVO, которое ввели, начиная с C++17, позволяет определять кастомные конструкторы за пределами класса. С определёнными ограничениями, конечно же.
Re[8]: Про красивость работы с std::vector
Здравствуйте, T4r4sB, Вы писали:

TB>Я имею в виду такой вариант: https://godbolt.org/z/5q55ofhaj

TB>а вот ставить && при объявлении переменных это шиза конечно

Ну так и в этом случае не RVO, а перемещение. Что и видно по выхлопу.

Вот RVO:

https://godbolt.org/z/ee51sTeez

#include <vector>
#include <cstdint>
#include <cstring>
#include <cstdio>

struct T {
    int value{};

    explicit T(int value) : value(value) { printf("T(%d)\n", value);}
    ~T() { printf("~T(%d)\n", value);}

    T(const T&) = delete;
    T(T&&) = delete;
    T& operator=(const T&) = delete;
    T& operator=(T&&) = delete;
};

T takeData(int value)
{
    return T(value);
}

int main() {
    auto t = takeData(42);
}


С практической точки зрения гарантированное RVO, которое ввели, начиная с C++17, позволяет определять кастомные конструкторы за пределами класса. С определёнными ограничениями, конечно же.