Почему набор boost :: hana не может быть создан по умолчанию?

сегодня я обнаружил, что boost::hana«s map а также set не могут быть построены по умолчанию, в то время как tuple является. Есть ли какая-то особая причина для этого, потому что это довольно раздражает.

это

#include <boost/hana/set.hpp>
//                   ^^^ or map

constexpr boost::hana::set<> a{};
//                     ^^^ or map

int main(){}

завершается со следующей ошибкой:

main.cpp:3:30: error: no matching constructor for initialization of 'const boost::hana::set<>'
constexpr boost::hana::set<> a{};
^~~
/home/russellg/Documents/boost/hana-0.6.0/include/boost/hana/set.hpp:65:28: note: candidate constructor not viable: requires single argument 'xs', but no arguments were provided
explicit constexpr set(tuple<Xs...> const& xs)
^
/home/russellg/Documents/boost/hana-0.6.0/include/boost/hana/set.hpp:69:28: note: candidate constructor not viable: requires single argument 'xs', but no arguments were provided
explicit constexpr set(tuple<Xs...>&& xs)
^
/home/russellg/Documents/boost/hana-0.6.0/include/boost/hana/set.hpp:57:12: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were
provided
struct set
^
/home/russellg/Documents/boost/hana-0.6.0/include/boost/hana/set.hpp:57:12: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were
provided
1 error generated.

хотя вполне допустимо иметь пустую карту или набор:

#include <boost/hana/set.hpp>
//                   ^^^ or map

constexpr auto a = boost::hana::make_set();
//                                   ^^^ or map

int main(){}

Который компилируется без нареканий.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ:

Это на самом деле не имеет значения, если оно пустое, это всегда незаконная конструкция по умолчанию mapс и sets.

2

Решение

hana::set а также hana::map представления определяются реализацией. Документация предостерегает от их прямого использования и упоминает, что канонический способ их создания заключается в hana::make_set а также hana::make_map соответственно. документация состояния:

Фактическое представление hana::set определяется реализацией. В частности, не следует принимать как должное порядок параметров шаблона и наличие какого-либо конструктора или оператора присваивания. Канонический способ создания hana::set через hana::make_set,

hana::tuple является более простым контейнером, документирует его представление и стремится поддерживать некоторый паритет с std::tuple, hana::basic_tuple документация заметки:

[…] hana::tuple стремится обеспечить интерфейс, близкий к std::tuple […]

Что касается почему hana::set а также hana::mapпредставления определяются реализацией, подумайте о прочтении Часто задаваемые вопросы, но вкратце:

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

Есть GitHub вопрос рассмотреть возможность добавления конструктора по умолчанию для hana::map,

3

Другие решения

Других решений пока нет …