Ответ 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
, не осознавая этого.