为什么boost :: hana的设置不是默认构造的?

时间:2015-11-30 01:22:55

标签: c++ boost c++14 template-meta-programming boost-hana

今天我发现boost::hana的{​​{1}}和map不是默认构造的,而set是。{1}}。这有什么特别的原因,因为它很烦人。

这个

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 s 总是非法。

1 个答案:

答案 0 :(得分:3)

hana::sethana::map表示是实现定义的。文档警告不要直接使用它们,并提到创建这些文档的规范方法分别是hana::make_sethana::make_mapdocumentation州:

  

hana::set的实际表示是实现定义的。特别是,不应该理所当然地认为模板参数的顺序以及任何构造函数或赋值运算符的存在。创建hana::set的规范方法是hana::make_set

hana::tuple是一个更简单的容器,记录其表示形式,并努力与std::tuple保持一定的平等。 hana::basic_tuple documentation注意事项:

  

[...] {...}}旨在提供一个接近hana::tuple [...]

的界面

至于为什么std::tuplehana::set的表示是实现定义的,请考虑阅读FAQ,但简而言之:

  • 允许更灵活地实现编译时和运行时优化
  • 知道类型通常不是很有用

有一个github issue可以考虑为hana::map添加默认构造函数。