Автоматически сгенерированные функции-члены класса в C ++ 11 для классов, которые не имеют конструкторов

В C ++ 11 я определяю структуру следующего общего вида:

struct MyStruct
{
static void myFunc( void );

//constructors
MyStruct( void ) = delete;
};

Невозможно создать объект типа MyStruct как конструктор по умолчанию помечен как удаленный. Даже метод myFunc не может создать экземпляр класса. Структура все еще используется, хотя, как MyStruct::myFunc является public и может быть вызван извне.

Мой вопрос сейчас: так как невозможно создать объект типа MyStructкомпилятор даже потрудится создать код для конструктора копирования, оператор адреса или деструктор?

Просто замечание: в случае с моим реальным кодом мне действительно нужно реализовать функциональность в терминах статических функций-членов класса, поскольку я должен использовать частичную специализацию класса шаблона, чтобы эмулировать частичную специализацию функции шаблона. Поэтому мне интересно, как я могу держать класс как можно тоньше.

редактировать: удалено замечание об автоматически сгенерированных адресных операторах в соответствии с комментарием и ответом @Praetorian.

3

Решение

Компилятор будет безоговорочно объявлять и деструктор, и конструктор копирования для вашего класса, но поскольку у вас нет возможности создать экземпляр класса, ваша программа никогда не сможет использовать odr-конструктор или конструктор копирования, из-за чего ни один из них не будет неявно определенный.

§12.4 [class.dtor]

4   Если в классе нет объявленного пользователем деструктора, деструктор неявно объявляется как дефолтный (8.4). Неявно объявленный деструктор является inline public член своего класса.

5   Деструктор, который по умолчанию и не определен как удаленный, неявно определяется, когда он используется odr (3.2) для уничтожения объекта своего класса (3.7) или когда он явно установлен по умолчанию после его первого объявления.

§12.8 [class.copy]

7   Если определение класса не объявляет явно конструктор копирования, он объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный конструктор копирования определяется как удаленный; в противном случае он определяется как дефолтный (8.4). Последний случай считается устаревшим, если в классе есть объявленный пользователем оператор копирования или объявленный пользователем деструктор.

13   Конструктор копирования / перемещения, который по умолчанию и не определен как удаленный, неявно определяется, если он используется odr (3.2) или когда он явно установлен по умолчанию после его первого объявления.

Что касается адреса оператора (operator&), компилятор никогда не генерирует эту перегрузку оператора для вас неявно. Встроенный адрес оператора может быть применен к любому типу lvalue, чтобы получить его адрес, но это языковая функция, не связанная с перегрузкой этого оператора для определенного пользователем типа.

5

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector