今天我发现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 总是非法。
答案 0 :(得分:3)
hana::set
和hana::map
表示是实现定义的。文档警告不要直接使用它们,并提到创建这些文档的规范方法分别是hana::make_set
和hana::make_map
。 documentation州:
hana::set
的实际表示是实现定义的。特别是,不应该理所当然地认为模板参数的顺序以及任何构造函数或赋值运算符的存在。创建hana::set
的规范方法是hana::make_set
。
hana::tuple
是一个更简单的容器,记录其表示形式,并努力与std::tuple
保持一定的平等。 hana::basic_tuple
documentation注意事项:
[...] {...}}旨在提供一个接近
的界面hana::tuple
[...]
至于为什么std::tuple
和hana::set
的表示是实现定义的,请考虑阅读FAQ,但简而言之:
有一个github issue可以考虑为hana::map
添加默认构造函数。