我正在学习websocketpp
仅限标头的库如何工作,而且我对于遍布各处的lib::error_code
类型感到非常困惑。 Xcode只会告诉我类型的声明在<system_error>
标题中,这有点令人困惑,因为我看到lib
是一个websocketpp命名空间。
然后我最终在websocketpp/common/system_error.hpp
中找到了这个:
namespace websocketpp {
namespace lib {
#ifdef _WEBSOCKETPP_CPP11_SYSTEM_ERROR_
using std::error_code;
这是命名空间内的using
,这不是我理解的内容。
这是做什么的?这只是将websocketpp::lib::error_code
简称为std::error_code
吗?
如果是这样,为什么这不被称为typedef std::error_code error_code
?这对我来说更有意义。
答案 0 :(得分:1)
两者几乎完全相同,参见What is the difference between 'typedef' and 'using' in C++11?带有相关标准报价。
也就是说,一位用户发现了有关语法的细微差别,参见Konstantin Oznobihin的答案在What are the differences between typedef and using?中(你不能使用&#34; Elaborated类型说明符&#34;使用typedef名称,但你可以使用带有using声明的名称)。参看比肩。标准草案的7.1.6.3。
答案 1 :(得分:1)
(此处为WebSocket ++库作者)using
允许将模板类别名化为C ++ 98中的命名空间。 typedef
(pre-c ++ 11)需要完全指定的类型。
对于lib::error_code
,这是无关紧要的,因为它不是模板类,而是命名空间websocketpp::lib
用于boost::
和std::
之间别名的一般模式要求它也适用于模板类(例如lib::shared_ptr
)。为了保持一致性,websocketpp::lib
中的所有别名都使用using
语法,而不是在非模板类的typedef
和模板的using
之间切换。