2015-11-30 2 views
2

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

Этот

#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(){} 

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

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

EDIT:

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

+0

Вам нужно больше разъяснений или обоснований по этой проблеме? Если нет, было бы неплохо принять предоставленный ответ, который мне кажется правильным. –

+0

Нет, спасибо, что напомнил мне: D –

ответ

3

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

The actual representation of a hana::set is implementation-defined. In particular, one should not take for granted the order of the template parameters and the presence of any constructor or assignment operator. The canonical way of creating a hana::set is through hana::make_set .

hana::tuple является более простой контейнер, документы свое представительство, и стремится сохранить некоторый паритет с std::tuple. В hana::basic_tupledocumentation примечания:

[...] hana::tuple aims to provide an interface somewhat close to a std::tuple [...]


Как почему hana::set и hana::map «ы представления от реализации, рассмотрим чтение FAQ, но короче:

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

Существует GitHub issue рассмотреть вопрос о добавлении по умолчанию-конструктор для hana::map.

+1

Хорошо. Как бы вы предложили передать контейнер в аргументе шаблона для класса? –

+0

@ RussellGreene Благодаря шаблонной фабричной функции для класса. –

+0

Хорошо, но каково было бы значение аргументов шаблона? –

Смежные вопросы