С++, ограничения конструктора

Я изучаю С++, и я не могу понять смысл жирного текста ниже:

Из Руководство IBM:

К конструкторам и деструкторам применяются следующие ограничения:

  • Конструкторы и деструкторы не имеют типов возврата и не могут возвращать значения.
  • Ссылки и указатели нельзя использовать для конструкторов и деструкторов, потому что их адреса не могут быть приняты.
  • Конструкторы не могут быть объявлены с помощью ключевого слова virtual.
  • Конструкторы и деструкторы не могут быть объявлены как static, const или volatile.
  • Союзы не могут содержать объекты класса, которые имеют конструкторы или деструкторы.

Не могли бы вы привести мне пример? Спасибо!

Ответ 1

Предложение означает, что вы не можете взять указатель на конструктор или деструктор. Вот пример:

class Sample{
    private: int x;
    public: Sample() { x = 100; };
    public: void* member() { x = 200; };
};

template <class X>
void call_me(Sample s, X function){
    (s.*function)();
};

call_me(s, &Sample::member);   //valid
call_me(s, &Sample::Sample);   //invalid
call_me(s, &Sample::~Sample);  //invalid

Обоснование таково:

  • Конструктор ничего не возвращает (хотя можно подумать о функции, которая возвращает инициализированный объект). Каким будет тип возврата в качестве функции-члена?
  • Конструктор на самом деле не является функцией-членом в том смысле, что он не может быть вызван на объект (например, s.member()).
  • Может быть создано несколько фактических функций для каждого конструктора и деструктора. Один конструктор может выделять память, а другой может (но все же инициализировать члены класса одинаковым образом). Один деструктор может уничтожить базовые подобъекты, а другой - нет. В каждом вызове ctor/dtor в исходном коде компилятор выбирает фактический "низкий уровень" ctor/dtor для вызова; этот выбор выполняется во время компиляции. Это невозможно сделать, если вы вызываете его с помощью указателя.
    Возможно, это означает, что "их адреса не могут быть приняты".

Ответ 2

Вы не можете сделать указатель на функцию (или ссылку), указывающий на конструктор.

Ответ 3

Первое предположение заключается в том, что вы не можете создать ссылку или указатель на конструктор/деструктор. Разумеется, "ссылка или указатель" в этом случае (если бы они были возможны) имела бы тип "ссылка на член" или "указатель-член", поскольку эти функции-члены не являются статическими. Однако эта интерпретация является проблемой по одной причине: в С++ нет такой вещи, как ссылка на член.

В принципе, упоминание "ссылки" в этой интерпретации не имеет никакого смысла: вы не можете иметь ссылку на любую нестатическую функцию-член класса, независимо от того, является ли это конструктором/деструктором или нет. В С++ просто нет такой вещи.

Если приведенная выше интерпретация верна (как и другие ответы), более значимая (но еще не префектная) формулировка будет

  • Указатели нельзя использовать для конструкторов и деструкторов, потому что их адреса не могут быть приняты.

Упоминание "ссылок" в этом контексте не имеет никакого смысла.

Ответ 4

они не могут быть статическими или виртуальными