我看到两种访问boost::optional
变量的方法:
如果我有这段代码:
#include <boost/optional.hpp>
#include <iostream>
int main()
{
boost::optional<int> oi;
std::cout << oi << "\n";
}
(其中oi未初始化)并使用&#34; g++-4.9 /tmp/optional.cc
&#34;进行编译。然后是./a.out
,我得到0,
但有了这个:
#include <boost/optional.hpp>
#include <iostream>
int main()
{
boost::optional<int> oi;
std::cout << *oi << "\n";
}
我明白了:
a.out: /usr/include/boost/optional/optional.hpp:631: boost::optional<T>::reference_type boost::optional<T>::get() [with T = int; boost::optional<T>::reference_type = int&]: Assertion `this->is_initialized()' failed.
Aborted (core dumped)
这是预期的行为。
答案 0 :(得分:1)
您必须使用较旧版本的Boost。您的第一个案例触发了转化为bool
;由于optional
不包含值,因此转化结果为false
,其打印为0
。
较新版本(1.56-1.57)向operator<<
<boost/optional.hpp>
函数模板声明
template<class CharType, class CharTrait, class T>
std::basic_ostream<CharType, CharTrait>&
operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v);
捕获这种错误并改为导致链接器错误。
请注意,包括<boost/optional/optional_io.hpp>
允许您实际使用带有optional
的流运算符,在这种情况下,不包含值的optional
将打印为--
。
答案 1 :(得分:0)
boost::optional<T>
ostream助手实际上可用,因为提升1.34。见http://www.boost.org/doc/libs/1_34_0/boost/optional/optional_io.hpp
请注意,需要 EXPLICITLY 包含<boost/optional/optional_io.hpp>
才能启用这些帮助程序。 <boost/optional.hpp>
包含 NOT 。