LINUX.ORG.RU

История изменений

Исправление KennyMinigun, (текущая версия) :

The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.

Ну оно то так, но есть еще понятие «constant expression». Т.е. то, что означено constexpr знгачит что *может* быть использовано в, собственно, «constant expression».

Т.е. если имеем constant expression

3 + 2;
то почему вот такое уже может не быть constant expression?
constexpr add(int a, int b) { return a + b; }
3 + add(1, 1);

С другой стороны да, должен признать что не нашел формального требования constexpr implies constant expression. Но тогда бы оно значило, что constexpr не можно использовать в рантайме?

А в стандарте много чего написано про constexpr, лень вычитывать :-/

В общем случае, если в сабжевом примере принудительно ввести constant-expression контекст, то ASM не изменится, а уверенность в compile-time вычислении уже будет:

    // если result не можно вычислить на єтапе компиляции -- не скомпилируется
    constexpr auto result = Rational(1,2)+Rational(1,3)+Rational(1,4)+Rational(1,5); 
    return result.denominator;

OK: https://wandbox.org/permlink/3Zd894d5VoyuCmJD
FAIL: https://wandbox.org/permlink/PcuzNW5KePWkvKdc

Исходная версия KennyMinigun, :

The constexpr specifier declares that it is possible to evaluate the value of the function or variable at compile time.

Ну оно то так, но есть еще понятие «constant expression». Т.е. то, что означено constexpr *может* быть использовано в, собственно, «constant expression».

Т.е. если имеем constant expression

3 + 2;
то почему вот такое уже может не быть constant expression?
constexpr add(int a, int b) { return a + b; }
3 + add(1, 1);

С другой стороны да, должен признать что не нашел формального требования constexpr implies constant expression. Но тогда бы оно значило, что constexpr не можно использовать в рантайме?

А в стандарте много чего написано про constexpr, лень вычитывать :-/

В общем случае, если в сабжевом примере принудительно ввести constant-expression контекст, то ASM не изменится, а уверенность в compile-time вычислении уже будет:

    // если result не можно вычислить на єтапе компиляции -- не скомпилируется
    constexpr auto result = Rational(1,2)+Rational(1,3)+Rational(1,4)+Rational(1,5); 
    return result.denominator;

OK: https://wandbox.org/permlink/3Zd894d5VoyuCmJD
FAIL: https://wandbox.org/permlink/PcuzNW5KePWkvKdc