Например:
struct X {
X(){/***/}
X(const int& ){/***/}
X( int&&){/***/}
X(const X& ) = default;
X( X&&) = default;
X& operator=(const X& ){/***/}
X& operator=( X&&){/***/}
};
Класс X
не тривиален и не является агрегатом.
Проверить исходный код класса X
не вариант (хотя известно, какие конструкторы и операторы доступны).
Я хочу знать, является ли конструктор явно заданным по умолчанию, а не предоставленным пользователем (т. е. определяемым пользователем), удаленным, вообще не определенным и т. д.
Но зачем вам это знать? Какова основная и актуальная проблема, которую может решить знание?
@JL В любом случае, AFAIK, не существует стандартного типа библиотеки или встроенной функции компилятора, которая могла бы предоставить вам информацию, которую вы ищете. Скорее всего, вам понадобится внешний скрипт для анализа исходного кода.
Что-то вроде en.cppreference.com/w/cpp/types/is_copy_constructible и т. д.? В общем случае оно НЕ МОЖЕТ отличаться от явного значения по умолчанию от тривиального, поскольку они имеют одинаковую семантику, между ними нет разницы. Но в контексте, где у вас есть нетривиальный конструктор по умолчанию, триальная копия может существовать только в том случае, если «явно установлено значение по умолчанию».
@Swift-FridayPie Итак, в этом примере, если я знаю, что конструктор по умолчанию не является тривиальным (возможно, я это знаю), мне просто нужно доказать, что конструктор копирования тривиален, чтобы убедиться, что он явно задан по умолчанию? Иначе его бы не существовало, так это работает?
@Someprogrammerdude Мне нужно знать, предоставляет ли язык C++ возможность идентифицировать такие случаи. Каковы будут последствия, если вместо этого использовать такой конструктор копирования X(const X& ) {}
?
@RemyLebeau Думаю, ваш второй комментарий - лучший ответ, т. е. это невозможно. Спасибо.
Кстати, я вижу 2 голоса за закрытие этого вопроса. С моей точки зрения, это правильный вопрос о языковых особенностях/способностях. Фактически, это показывает ограниченность знаний, которые вы можете иметь, несмотря на то, что некоторые люди считают их бесполезными, это именно то, что мне нужно было знать.
@JL Я проголосовал за то, чтобы закрыть вопрос как «Требуются подробности или ясность», поскольку до сих пор не ясно, ПОЧЕМУ вам это нужно. В любом случае X(const X& ) {}
является допустимым конструктором копирования с точки зрения сигнатуры, отсутствие тела — это скорее проблема логики времени выполнения, и проверка во время компиляции вам в этом не поможет.
К сожалению, ваш вопрос — это проблема XY. У вас есть решение, с которым вам нужна помощь, но вы не говорите нам, какую проблему оно должно решить на самом деле. Возможно, есть другие возможные решения? Если вы напрямую спросите о реальной и основной проблеме и расскажете нам о решении, о котором вы подумали, мы сможем помочь вам гораздо лучше.
Приведенный выше код — всего лишь пример, он ничего не решает. Вопрос, на который я хотел ответить, для других целей, которые выходят за рамки и не имеют отношения к данному вопросу, заключается в том, можно ли вообще проверить, является ли конструктор явно заданным по умолчанию, то есть поддерживает ли это язык C++. Я не смог найти способ сделать это, поэтому и спросил здесь (хотя подозревал, что это невозможно). Теперь я думаю, что это невозможно, так что спасибо всем за помощь :)
В библиотеке для этого нет черты. Проверить с помощью основного языка тоже невозможно.
Какой вопрос/сценарий использования вас интересует?