Question: I am used to using `enum` as constants -- they're quick to write, can be placed in .h files, and work fine.

```
enum {BOX_LEFT=10, BOX_TOP=50, BOX_WIDTH=100, BOX_HEIGHT=50};
enum {REASONS_I_LIKE_ENUM_AS_CONSTANTS = 3};

```

Is this no longer a good idea? 

I see good [reasons](https://stackoverflow.com/questions/18335861/why-is-enum-class-preferred-over-plain-enum) to prefer enum class (conventional enums implicitly convert to int; conventional enums export their enumerators to the surrounding scope), but those are reasons to prefer old enum in this case.

I see in a thread on [static constexpr int vs old-fashioned enum](https://stackoverflow.com/questions/37259807/static-constexpr-int-vs-old-fashioned-enum-when-and-why) that old-style enum is better because with a static constexpr member you have to declare it outside the class as well. But this is apparently no longer true in C++17, and may only apply to class members anyway.

What's the preferred way in c++17?

Answer: 
This is subjective.

However, this was *always* an abuse of enums. You're not enumerating anything; you're just stealing the `enum` feature to get some unrelated with arbitrary integer values which are not intended to have their own logical "type".

That's why `enum class` is not appropriate here either (because, as you pointed out, `enum class` *enforces* the properties of an `enum` that *should* be there but which you do not actually want).

Since there's no longer any problem with `static constexpr int`, I'd use that (or `constexpr inline int`, or whatever it is this week).
The example that you give for using `enum`'s can be rewritten as:

```
struct Point
{
    int x;
    int y;
};

struct Box
{
    Point p;

    int width;
    int height;
};

constexpr Box b = { { 1, 2 }, 3, 4 };

int f()
{
    return b.p.x;
}

```

Using strong types instead of `int` could even be a benefit.

For me this is more legible. I could even add some functions into that.