Почему не меняется значение переменной после выражения (a = b) в decltype?

В C++, выражение decltype(a = b) имеет особое поведение, которое называется правилами поддержки ленивых вычислений. Из-за этих правил, выражение a = b внутри decltype не изменяет значение переменной a.

Правила поддержки ленивых вычислений гарантируют, что выражение в decltype не будет вычислено при компиляции, а будет отложено до момента выполнения. Поэтому, когда вы пишете decltype(a = b), компилятор не вычисляет a = b, а просто записывает тип результата выражения a = b.

Чтобы лучше понять это поведение, рассмотрим пример:

#include <iostream>

int main() {
    int a = 5;
    int b = 10;
    
    decltype(a = b) result = a;
    std::cout << "result: " << result << std::endl;
    std::cout << "a: " << a << std::endl;
    
    return 0;
}

В этом примере, переменная a равна 5, а b равна 10. Мы объявляем переменную result с типом decltype(a = b), то есть типом выражения a = b. Внешний вид этого выражения подразумевает присваивание. Однако, поскольку правила поддержки ленивых вычислений начинают действовать, это выражение не изменяет значение a.

Вывод программы будет:

result: 5
a: 5

Это связано с тем, что значение a не изменяется в результате выражения a = b, поскольку в decltype не происходит вычисления этого выражения. Вместо этого, decltype(a = b) просто получает тип результата выражения a = b, который является типом int&. Затем, поскольку инициализация result происходит с помощью значения a, его значение 5 сохраняется.

Ключевое слово decltype не изменяет или присваивает значения переменным. Оно только получает тип выражения и используется для объявления переменных или возвращаемых типов функций. Если вам нужно присвоить значение переменной a на основе выражения a = b, вы должны использовать a = b отдельно, без decltype.