Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

#include <algorithm>

struct S
{
    static constexpr int X = 10;
};

int main()
{
    return std::min(S::X, 0);
};

If std::min expects a const int&, the compiler very likely would like to have the S::X also defined somewhere, i.e. the storage of S::X must exists.

See here or here.

Is there a way to force the compiler to evaluate my constexpr at compile time?

The reason is:

Initially, we had a problem in early initialization of static variables in the init priority. There was some struct Type<int> { static int max; };, and some global static int x = Type<int>::max;, and some other early code other_init used that x. When we updated GCC, suddenly we had x == 0 in other_init.

We thought that we could avoid the problem by using constexpr, so that it would always evaluate it at compile time.

The only other way would be to use struct Type<int> { static constexpr int max(); }; instead, i.e. letting it be a function.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
685 views
Welcome To Ask or Share your Answers For Others

1 Answer

The constexpr is evaluated at compile time. Your problem is due to the fact that std::min is not a constexpr, so regardless of its input, the results are not a const expression (and in particular, if you initialize a variable with static lifetime using std::min, it is dynamic initialization).

The simplest solution is probably to define your own min, something along the lines of:

template <typename T>
constexpr T staticMin( T a, T b )
{
    return a > b ? b : a;
}

This should result in full evaluation at compile time, and static initialization.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...