class Foo
{
public:
virtual int foo() final = 0;
};
Скомпилируется отлично.
Разве не Foo
просто пустая трата пространства и авария в процессе создания? Или я что-то упускаю?
class Foo
{
public:
virtual int foo() final = 0;
};
Скомпилируется отлично.
Разве не Foo
просто пустая трата пространства и авария в процессе создания? Или я что-то упускаю?
Это почти полная потеря пространства, как вы сказали. Для этого есть хотя бы одно допущение. То, что он компилируется, кстати, не удивительно. Пока код является законным, он не должен "иметь смысл" для компиляции.
Предположим, вы хотите использовать Foo
в качестве политики. Это означает, что он будет использоваться в качестве параметра шаблона, но его не нужно создавать. На самом деле, вы действительно не хотите, чтобы кто-либо когда-либо создавал экземпляр класса (хотя, по общему признанию, я не знал, почему, что может быть больно).
Это именно то, что у вас есть. Класс с типом, на который вы можете положиться, но вы не можете его создать (хотя создание частного конструктора, вероятно, будет намного более простым).
В качестве дополнительного бонуса вы можете добавить enum
или статические функции внутри класса. Они могут быть использованы без создания экземпляров, и они будут находиться в пространстве имен этого класса. Итак, у вас есть класс, который в основном используется только как тип, но у вас все еще есть "некоторая функциональность", связанная с ним в виде статических функций.
В большинстве случаев можно было бы просто переносить этот материал в пространство имен, но кто знает, в какой-то ситуации это может быть желательным способом.
Разве Foo не пустая трата пространства
В самом деле, это так; вы не можете создать экземпляр, поскольку он является абстрактным, и вы не можете переопределить функцию, чтобы сделать неабстрактный производный класс.
Он может использоваться как способ предотвращения создания экземпляра класса, если вы хотите сделать это по какой-либо причине; но даже тогда было бы разумнее удалить конструктор по умолчанию.
и несчастный случай при изготовлении?
Не совсем. Поскольку вы ничего не можете сделать с классом, вы не можете сделать с ним ничего плохого.
Если я правильно читаю грамматику в 9.2, это действительно законно, хотя я, возможно, пропустил что-то в примечаниях, запрещающих это.
член-описатель: declarator virt-specifier-seq (opt) pure-specifier (opt)
Затем он показывает, что virt-specifier-seq
может быть final
, а pure-specifier
- = 0
Я не вижу никакого способа, чтобы это было полезно, хотя может быть какой-то угловой случай, который его использует.