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

Сообщение Re: Вы пользуетесь constexpr? от 29.11.2024 3:40

Изменено 29.11.2024 3:50 Shmj

Re: Вы пользуетесь constexpr?
Здравствуйте, cppguard, Вы писали:

C>Заметил, что значительная часть нескольких последних стандартов иделяется этой части языка. Даже вот consteval появился. А насколько это реально нужно на практике? Точнее, у вас есть реальный пример, когда это было настолько нужно, что эквивалентоное единовременное вычисление на стадиции инициализации программы сильно проигрывает? Вообще существуют ещё языки, где есть что-то подобное?


Хотя rg45 и критиковал мою концепцию, однако все-же C++ разделятся на два разных подъязыка:

1. С++ времени компиляции.
2. C++ времени исполнения.

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

Первый ограничен — там нет возможности взаимодействия с системой, динамической памяти и пр. Но он довольно сложен, в чем-то даже более мозгодробилен, чем классический C++ времени исполнения.

Время компиляции допускает не так уж много конструкций. Интересные примеры:

Цикл, казалось бы:

constexpr int sumUpTo(int n)
{
    int sum = 0;
    for (int i = 1; i <= n; ++i)
        sum += i;
    return sum;
}

constexpr int sum = sumUpTo(10);


А вот if — не умеет, нужно только if constexpr:

template <typename T>
constexpr auto process(T value)
{
    if constexpr (std::is_integral_v<T>)
        return value * 2; // Вычисляется, если T — целое число
    else
        return value / 2;
}

constexpr int result = process(5); // Результат 10


И даже

struct Point
{
    int x, y;
    constexpr Point(int x, int y) : x(x), y(y) {}
    constexpr int distance() const { return x * x + y * y; }
};

constexpr Point p(3, 4);
constexpr int dist = p.distance();
Re: Вы пользуетесь constexpr?
Здравствуйте, cppguard, Вы писали:

C>Заметил, что значительная часть нескольких последних стандартов иделяется этой части языка. Даже вот consteval появился. А насколько это реально нужно на практике? Точнее, у вас есть реальный пример, когда это было настолько нужно, что эквивалентоное единовременное вычисление на стадиции инициализации программы сильно проигрывает? Вообще существуют ещё языки, где есть что-то подобное?


Хотя rg45 и критиковал мою концепцию, однако все-же C++ разделятся на два разных подъязыка:

1. С++ времени компиляции.
2. C++ времени исполнения.

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

Первый ограничен — там нет возможности взаимодействия с системой, динамической памяти и пр. Но он довольно сложен, в чем-то даже более мозгодробилен, чем классический C++ времени исполнения.

Время компиляции допускает не так уж много конструкций. Интересные примеры:

Цикл, казалось бы:

constexpr int sumUpTo(int n)
{
    int sum = 0;
    for (int i = 1; i <= n; ++i)
        sum += i;
    return sum;
}

constexpr int sum = sumUpTo(10);


А вот if — не умеет, нужно только if constexpr:

template <typename T>
constexpr auto process(T value)
{
    if constexpr (std::is_integral_v<T>)
        return value * 2; // Вычисляется, если T — целое число
    else
        return value / 2;
}

constexpr int result = process(5); // Результат 10


И даже

struct Point
{
    int x, y;
    constexpr Point(int x, int y) : x(x), y(y) {}
    constexpr int distance() const { return x * x + y * y; }
};

constexpr Point p(3, 4);
constexpr int dist = p.distance();


Ваш вопрос мне так же интересен, но пока он для меня открыт. Имхо, какая-то ошибка концептуальная возникла, из-за чего пришлось добавлять подъязык в языке.