Атрибуты указателя boost :: spirit инициализируются с помощью nullptr? - PullRequest
0 голосов
/ 13 сентября 2018

Кажется, я где-то видел в отладчике, что атрибут boost::spirit некоторого типа указателя был установлен на nullptr, но я этого не делал.Было ли это просто совпадением или boost::spirit на самом деле заботится об инициализации атрибутов типа указателя?

В настоящее время я ставлю eps [ _val = nullptr ] в начале правила, когда мне нужно быть уверенным, но было бы неплохочтобы я мог опустить это.

1 Ответ

0 голосов
/ 13 сентября 2018

действительно ли boost :: spirit заботится об инициализации атрибутов типа указателя?

Эффективно, да.

Дух использует make_attribute. Кажется, что комментарий указывает, что это произойдет только для семантических действий, но на самом деле он также используется внутри синтаксического анализатора rule (но то, что передается выражениям подпаратера, может быть преобразовано).

make_attribute использует черту boost::value_initialized :

Создание и инициализация объектов в общем виде затруднены в C ++. Проблема в том, что есть несколько разных правил, которые применяются для инициализации. В зависимости от типа, значение вновь созданного объекта может быть инициализировано нулем (логически 0), построено по умолчанию (используя конструктор по умолчанию) или неопределено. При написании общего кода эта проблема должна быть решена. Шаблон value_initialized предоставляет решение с согласованным синтаксисом для инициализации значений скалярных типов, типов объединений и классов. Кроме того, value_initialized предлагает обходной путь для различных проблем компилятора, касающихся инициализации значения. Кроме того, предоставляется const-объект initialized_value, чтобы избежать повторения имени типа при извлечении значения из объекта value_initialized.

Итак, за исключением любых пользовательских специализаций в вашем коде, поведение по умолчанию действительно предлагает инициализацию значения.

...