У меня есть простая структура ниже, которая используется в константных выражениях с агрегатной инициализацией синтаксисом. Теперь я хотел бы сделать test::c
необязательным благодаря NSDMI , но это вызывает ошибку для конструктора по умолчанию в контексте константного выражения с gcc и clang.
Я не понимаю, почемунеявный конструктор по умолчанию - инициализирует все члены в первом случае, но не с NSDMI. Нет ошибки, если я устанавливаю значение по умолчанию для всех участников, но это не то, что я хочу. Более того, я не могу объявить конструктор по умолчанию, потому что структура больше не будет агрегатом.
- Как конструктор по умолчанию неявно генерируется в обоих случаях? Есть ли стандартное правило?
- Есть ли способ исправить ошибку и сохранить предупреждение [- Wmissing-field-initializer] ?
#include "debug.h"
struct test {
//OK
/* int a, b, c; */
/* int a=0, b=0, c=3; */
//ERROR
int a, b, c=3;
};
int main(){
const test val1 = test(); //{0,0,3}
constexpr test val2 = test(); //error: call to non-'constexpr' function 'test::test()'
constexpr test val3 = {}; //{0,0,3}
constexpr test val4 = {1}; //warning: missing initializer for member 'test::b'
constexpr test val5 = {1,2}; //{1,2,3}
}
Вывод:
test.cpp: In function 'int main()':
test.cpp:13:32: error: call to non-'constexpr' function 'test::test()'
constexpr test val2 = test();
^
test.cpp:3:8: note: 'test::test()' is not usable as a 'constexpr' function because:
struct test {
^~~~
test.cpp:8:9: note: defaulted default constructor does not initialize 'int test::a'
int a, b, c=3;
^
test.cpp:8:12: note: defaulted default constructor does not initialize 'int test::b'
int a, b, c=3;
^
test.cpp:15:29: warning: missing initializer for member 'test::b' [-Wmissing-field-initializers]
constexpr test val4 = {1};
^
Спасибо за помощь.