сегодня я обнаружил, что 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
с и set
s.
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
,
Других решений пока нет …