Ответ 1
Это почти полная потеря пространства, как вы сказали. Для этого есть хотя бы одно допущение. То, что он компилируется, кстати, не удивительно. Пока код является законным, он не должен "иметь смысл" для компиляции.
Предположим, вы хотите использовать Foo
в качестве политики. Это означает, что он будет использоваться в качестве параметра шаблона, но его не нужно создавать. На самом деле, вы действительно не хотите, чтобы кто-либо когда-либо создавал экземпляр класса (хотя, по общему признанию, я не знал, почему, что может быть больно).
Это именно то, что у вас есть. Класс с типом, на который вы можете положиться, но вы не можете его создать (хотя создание частного конструктора, вероятно, будет намного более простым).
В качестве дополнительного бонуса вы можете добавить enum
или статические функции внутри класса. Они могут быть использованы без создания экземпляров, и они будут находиться в пространстве имен этого класса. Итак, у вас есть класс, который в основном используется только как тип, но у вас все еще есть "некоторая функциональность", связанная с ним в виде статических функций.
В большинстве случаев можно было бы просто переносить этот материал в пространство имен, но кто знает, в какой-то ситуации это может быть желательным способом.