Совокупная ошибка конструктора по умолчанию для constexpr с частичным NSDMI - PullRequest
0 голосов
/ 16 октября 2019

У меня есть простая структура ниже, которая используется в константных выражениях с агрегатной инициализацией синтаксисом. Теперь я хотел бы сделать test::c необязательным благодаря NSDMI , но это вызывает ошибку для конструктора по умолчанию в контексте константного выражения с gcc и clang.

Я не понимаю, почемунеявный конструктор по умолчанию - инициализирует все члены в первом случае, но не с NSDMI. Нет ошибки, если я устанавливаю значение по умолчанию для всех участников, но это не то, что я хочу. Более того, я не могу объявить конструктор по умолчанию, потому что структура больше не будет агрегатом.

  1. Как конструктор по умолчанию неявно генерируется в обоих случаях? Есть ли стандартное правило?
  2. Есть ли способ исправить ошибку и сохранить предупреждение [- 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};
                             ^

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...