Как проверить, является ли конструктор явно дефолтным

Например:

struct X {
    X(){/***/}
    X(const int& ){/***/}
    X(      int&&){/***/}
    X(const X& ) = default;
    X(      X&&) = default;
    X& operator=(const X& ){/***/}
    X& operator=(      X&&){/***/}
};

Класс X не тривиален и не является агрегатом.

Проверить исходный код класса X не вариант (хотя известно, какие конструкторы и операторы доступны).

Какой вопрос/сценарий использования вас интересует?

Remy Lebeau 02.05.2024 21:25

Я хочу знать, является ли конструктор явно заданным по умолчанию, а не предоставленным пользователем (т. е. определяемым пользователем), удаленным, вообще не определенным и т. д.

J L 02.05.2024 21:32

Но зачем вам это знать? Какова основная и актуальная проблема, которую может решить знание?

Some programmer dude 02.05.2024 21:50

@JL В любом случае, AFAIK, не существует стандартного типа библиотеки или встроенной функции компилятора, которая могла бы предоставить вам информацию, которую вы ищете. Скорее всего, вам понадобится внешний скрипт для анализа исходного кода.

Remy Lebeau 02.05.2024 21:55

Что-то вроде en.cppreference.com/w/cpp/types/is_copy_constructible и т. д.? В общем случае оно НЕ МОЖЕТ отличаться от явного значения по умолчанию от тривиального, поскольку они имеют одинаковую семантику, между ними нет разницы. Но в контексте, где у вас есть нетривиальный конструктор по умолчанию, триальная копия может существовать только в том случае, если «явно установлено значение по умолчанию».

Swift - Friday Pie 02.05.2024 23:59

@Swift-FridayPie Итак, в этом примере, если я знаю, что конструктор по умолчанию не является тривиальным (возможно, я это знаю), мне просто нужно доказать, что конструктор копирования тривиален, чтобы убедиться, что он явно задан по умолчанию? Иначе его бы не существовало, так это работает?

J L 03.05.2024 01:42

@Someprogrammerdude Мне нужно знать, предоставляет ли язык C++ возможность идентифицировать такие случаи. Каковы будут последствия, если вместо этого использовать такой конструктор копирования X(const X& ) {}?

J L 03.05.2024 01:49

@RemyLebeau Думаю, ваш второй комментарий - лучший ответ, т. е. это невозможно. Спасибо.

J L 03.05.2024 21:25

Кстати, я вижу 2 голоса за закрытие этого вопроса. С моей точки зрения, это правильный вопрос о языковых особенностях/способностях. Фактически, это показывает ограниченность знаний, которые вы можете иметь, несмотря на то, что некоторые люди считают их бесполезными, это именно то, что мне нужно было знать.

J L 03.05.2024 21:31

@JL Я проголосовал за то, чтобы закрыть вопрос как «Требуются подробности или ясность», поскольку до сих пор не ясно, ПОЧЕМУ вам это нужно. В любом случае X(const X& ) {} является допустимым конструктором копирования с точки зрения сигнатуры, отсутствие тела — это скорее проблема логики времени выполнения, и проверка во время компиляции вам в этом не поможет.

Remy Lebeau 03.05.2024 21:57

К сожалению, ваш вопрос — это проблема XY. У вас есть решение, с которым вам нужна помощь, но вы не говорите нам, какую проблему оно должно решить на самом деле. Возможно, есть другие возможные решения? Если вы напрямую спросите о реальной и основной проблеме и расскажете нам о решении, о котором вы подумали, мы сможем помочь вам гораздо лучше.

Some programmer dude 03.05.2024 22:00

Приведенный выше код — всего лишь пример, он ничего не решает. Вопрос, на который я хотел ответить, для других целей, которые выходят за рамки и не имеют отношения к данному вопросу, заключается в том, можно ли вообще проверить, является ли конструктор явно заданным по умолчанию, то есть поддерживает ли это язык C++. Я не смог найти способ сделать это, поэтому и спросил здесь (хотя подозревал, что это невозможно). Теперь я думаю, что это невозможно, так что спасибо всем за помощь :)

J L 04.05.2024 00:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В библиотеке для этого нет черты. Проверить с помощью основного языка тоже невозможно.

Другие вопросы по теме

Как JavaScript «решает», как печатать имя класса?
Функция потока С++ принимает объект класса по значению: почему вызывается конструктор перемещения?
Что не так с этим Java-кодом? У меня есть несколько ошибок при запуске
Какими должны быть параметры объекта ctor при сопоставлении dto с объектом?
Конструктор класса Ruby, использующий `()` вместо `.new()`
Как устранить ошибку компилятора: в моем случае нет соответствующей функции для вызова dmhFS::dmhFS()?
Разрешено ли передавать «это» производного класса конструктору базового класса?
Как правильно реализовать структуры данных на C (в основном об указателях), если у вас есть опыт работы с Java. Например. правильно создать конструктор?
Наследование. Можно ли «принудительно» установить значения переменных относительно производного класса?
Законно ли обнулять пустые классы C++ в конструкторе и наследовать от них?