Я изучаю C++, и я не могу понять значение полужирного предложения ниже:
Из руководства IBM:
Следующие ограничения относятся к конструкторам и деструкторам:
- У конструкторов и деструкторов нет типов возврата, и при этом они не могут возвращать значения.
- Ссылки и указатели не могут использоваться на конструкторах и деструкторах, потому что их адреса не могут быть взяты.
- Конструкторы не могут быть объявлены с виртуальным ключевым словом.
- Конструкторы и деструкторы не могут быть объявлены статичные, константа, или энергозависимые.
- Объединения не могут содержать объекты класса, которые имеют конструкторов или деструкторы.
Вы могли предоставить мне пример?Спасибо!
Предложение означает, что вы не можете принимать указатель на конструктор или деструктор. Вот пример:
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 ()
). Вы не можете создать указатель функции (или ссылку), указывающий на конструктор.
Первое предположение состоит в том, что вы не можете создать ссылку или указатель на конструктор / деструктор. Конечно, «ссылка или указатель» в этом случае (если бы они были возможны) имели бы тип «ссылка на член» или «указатель на член», поскольку эти функции-члены не являются статическими. Однако такая интерпретация проблематична по одной причине: в C ++ нет такой вещи, как ссылка на член.
По сути, упоминание «ссылки» в этой интерпретации не имеет никакого смысла: вы не можете иметь ссылку на любую нестатическую функцию-член класса, независимо от того, является ли она конструктор / деструктор или нет. В C ++ такого просто нет.
Если приведенная выше интерпретация верна (как предполагалось в других ответах), более значимой (но все же не префектной) формулировкой будет
Упоминание «ссылок» в этом контексте не имеет никакого смысла.