为什么 std::is_error_code_enum<std::errc>::value 是假的?
Why is std::is_error_code_enum<std::errc>::value false?
If T is an error code enumeration, this template provides the member constant value equal true.
std::errc
描述为:
The scoped enumeration std::errc defines the values of portable error conditions
那么,std::is_error_code_enum<std::errc>::value
应该是true
吧?然而对我来说,这是错误的。这是故意的吗?
这很重要,因为没有它,从 std::errc
到 std::error_code
的隐式转换不存在。
The is_error_code_enum and is_error_condition_enum may be
specialized for program-defined types to indicate that such types are
eligible for class error_code and class error_condition automatic
conversions, respectively.
is_error_condition_enum<>::value 值为 true
for std::errc
:
template<> struct is_error_condition_enum<errc> : true_type {};
std::errc
是错误 条件 的枚举。也就是说
std::is_error_condition_enum<T>::value;
将是 true
。因为它不是错误 codes
的枚举
std::is_error_code_enum<T>::value;
应该是,现在也是,false
。
为了启用 std::errc
中的 std::error_code
构造函数和赋值运算符,我们需要明确说明 std::is_error_code_enum<std::errc>
应该 return 为真。否则构造函数和赋值运算符将被禁用。
#include <iostream>
#include <system_error>
// Enable error_code(errc) and error_code = errc
template <> struct std::is_error_code_enum<std::errc>
: std::true_type {};
int main() {
std::error_code inv_arg1(std::errc::invalid_argument);
std::error_code inv_arg2;
inv_arg2 = std::errc::invalid_argument;
std::cout << inv_arg1 << std::endl;
std::cout << inv_arg2 << std::endl;
return 0;
}
If T is an error code enumeration, this template provides the member constant value equal true.
std::errc
描述为:
The scoped enumeration std::errc defines the values of portable error conditions
那么,std::is_error_code_enum<std::errc>::value
应该是true
吧?然而对我来说,这是错误的。这是故意的吗?
这很重要,因为没有它,从 std::errc
到 std::error_code
的隐式转换不存在。
The is_error_code_enum and is_error_condition_enum may be specialized for program-defined types to indicate that such types are eligible for class error_code and class error_condition automatic conversions, respectively.
is_error_condition_enum<>::value 值为 true
for std::errc
:
template<> struct is_error_condition_enum<errc> : true_type {};
std::errc
是错误 条件 的枚举。也就是说
std::is_error_condition_enum<T>::value;
将是 true
。因为它不是错误 codes
std::is_error_code_enum<T>::value;
应该是,现在也是,false
。
为了启用 std::errc
中的 std::error_code
构造函数和赋值运算符,我们需要明确说明 std::is_error_code_enum<std::errc>
应该 return 为真。否则构造函数和赋值运算符将被禁用。
#include <iostream>
#include <system_error>
// Enable error_code(errc) and error_code = errc
template <> struct std::is_error_code_enum<std::errc>
: std::true_type {};
int main() {
std::error_code inv_arg1(std::errc::invalid_argument);
std::error_code inv_arg2;
inv_arg2 = std::errc::invalid_argument;
std::cout << inv_arg1 << std::endl;
std::cout << inv_arg2 << std::endl;
return 0;
}