Почему я должен предпочесть static constexpr int в классе над enum для интегральных констант на уровне класса?
Обновление C ++ 17: static constexpr
переменные неявноinline
поэтому нет необходимости во внешнем определении.
Оригинальный вопрос:
Допустим, у меня есть список констант, таких как
struct Cls {
static constexpr int N = 32;
static constexpr int M = 64;
};
Это, конечно, говорит о том, что я добавляю определения для них, чтобы избежать проблем с использованием ODR, поэтому мне нужно:
constexpr int Cls::N;
constexpr int Cls::M;
Зачемдолжен Я предпочитаю это
struct Cls {
enum : int {
N = 32,
M = 64
};
};
Что избавляет меня от головной боли при использовании ODR сN
а такжеM
на самом деле это просто константы, а не объекты сами по себе (более крупная сделка, если это только заголовок) и короче. Я мог бы явно указать типenum : long long
или что угодно, если нужно. В чем преимущество первого?