Подтвердить что ты не робот

Должен ли я помечать конструктор-сгенерированный конструктор как constexpr?

Есть ли разница между выполнением:

X() = default;

и

constexpr X() = default;

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

4b9b3361

Ответ 1

Так как неявный конструктор на самом деле constexpr в вашем случае & hellip;

[C++11: 12.1/6]: [..] Если этот пользовательский конструктор по умолчанию будет удовлетворять требованиям конструктора constexpr (7.1.5), неявно определенный конструктор по умолчанию - constexpr. [..]

[C++11: 7.1.5/3]: Определение функции constexpr должно удовлетворять следующим ограничениям:

  • он не должен быть виртуальным (10.3);
  • его тип возврата должен быть буквальным типом;
  • каждый из его типов параметров должен быть литеральным типом;
  • его тело-функция должно быть = delete, = default или составной оператор, содержащий только
    • null,
    • static_assert-декларация
    • typedef декларации и псевдонимы-объявления, которые не определяют классы или перечисления,
    • с использованием деклараций,
    • с использованием Директив,
    • и ровно один оператор return;
  • каждый вызов конструктора и неявное преобразование, используемое при инициализации возвращаемого значения (6.6.3, 8.5), должны быть одним из разрешенных в постоянном выражении (5.19).

& hellip; объявления фактически эквивалентны:

[C++11: 8.4.2/2]: Явная функция по умолчанию может быть объявлена ​​ constexpr только в том случае, если она была бы неявно объявлена ​​как constexpr и может иметь явную спецификацию исключения только в том случае, если она совместима (15.4) с исключением - Спецификация о неявной декларации. Если в первом объявлении функция явно дефолтована,

  • он неявно считается constexpr, если неявное объявление будет,
  • подразумевается, что он имеет одинаковую спецификацию исключения, как если бы он был неявно объявлен (15.4) и
  • в случае конструктора копирования, перемещения конструктора, оператора присваивания копии или оператора переадресации, он должен иметь тот же тип параметра, как если бы он был неявно объявлен.

Итак, сделайте либо: — это не имеет значения.

В общем случае, если вы определенно хотите, чтобы конструктор был constexpr, тем не менее, может быть разумным оставить ключевое слово так, чтобы вы хотя бы получили ошибку компилятора, если она не соответствует критериям; оставляя это, вы можете получить конструктор не constexpr, не осознавая этого.