正确的使用方法 boost::optional
Right way to use boost::optional
我看到两种访问 boost::optional
变量的方法:
- 变量的取消引用运算符
- 变量本身
如果我有这个代码片段:
#include <boost/optional.hpp>
#include <iostream>
int main()
{
boost::optional<int> oi;
std::cout << oi << "\n";
}
(其中 oi 未初始化)并使用“g++-4.9 /tmp/optional.cc
”编译它,然后是 ./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)
这是预期的行为。
您一定一直在使用旧版本的 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
将打印为 --
.
boost::optional<T>
ostream 助手自 boost 1.34 以来实际上可用。参见 http://www.boost.org/doc/libs/1_34_0/boost/optional/optional_io.hpp
请注意,需要 EXPLICITLY 包含 <boost/optional/optional_io.hpp>
才能启用这些助手。它 NOT 包含在 <boost/optional.hpp>
中。
我看到两种访问 boost::optional
变量的方法:
- 变量的取消引用运算符
- 变量本身
如果我有这个代码片段:
#include <boost/optional.hpp>
#include <iostream>
int main()
{
boost::optional<int> oi;
std::cout << oi << "\n";
}
(其中 oi 未初始化)并使用“g++-4.9 /tmp/optional.cc
”编译它,然后是 ./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)
这是预期的行为。
您一定一直在使用旧版本的 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
将打印为 --
.
boost::optional<T>
ostream 助手自 boost 1.34 以来实际上可用。参见 http://www.boost.org/doc/libs/1_34_0/boost/optional/optional_io.hpp
请注意,需要 EXPLICITLY 包含 <boost/optional/optional_io.hpp>
才能启用这些助手。它 NOT 包含在 <boost/optional.hpp>
中。