std::to_integer 的目的是什么?
What's the purpose of std::to_integer?
据我所知,std::to_integer<T>
等同于 T(value)
,其中 value
是类型为 std::byte
的变量。
我研究了主要编译器的一些实现,发现在这种情况下 等效 的字面意思是 实现为 。换句话说,大多数时候 to_integer
实际上实现为:
return T(value);
仅此而已。
我不明白的是这样一个功能的目的是什么?
具有讽刺意味的是,缺点甚至超过优点。我应该为这样一个函数包含一个完整的头文件,只是为了避免一个很可能直接内联的类似 C 的转换。
是否还有其他原因,或者它真的只是一个 漂亮的 类 C 演员表的替代品,仅此而已?
it's just really a nice looking alternative for a C-like cast and nothing more?
你说的好像是一些微不足道的细节。
强制转换很危险。将某些内容转换为错误的类型很容易,而且编译器通常不会阻止您这样做。此外,由于 std::byte
在 C++ 中不是整数类型,因此使用数字字节值通常需要进行大量转换。拥有一个显式转换为整数的函数可以提供更安全的用户体验。
例如,float(some_byte)
是完全合法的,而 to_integer<float>(some_byte)
是明确禁止的。 to_integer<T>
要求 T
是整数类型。
to_integer
是 更安全的 替代方案。
I should include a whole header for such a function
如果 "whole header",你的意思是 相同的 header 你从 std::byte
中得到,因此根据定义已经包括在内......
std::to_integer<T>(some_byte)
is equivalent to T(some_byte)
if it actually compiles. T(some_byte)
is equivalent to the unsafe C-style cast of (T)some_byte
, which can do scary things。另一方面,std::to_integer
被适当地限制为仅在安全时工作:
This overload only participates in overload resolution if std::is_integral_v<IntegerType>
is true.
如果 T
实际上不是整数类型,而不是潜在的未定义行为,代码将无法编译。如果 some_byte
实际上不是 std::byte
,而不是潜在的未定义行为,代码将无法编译。
C 风格转换不等同于 std::to_integer<T>
。请参见下面的示例。
std::to_integer<T>
仅在 std::is_integral_v<T>
为真时参与重载决策。
#include <cstddef>
#include <iostream>
template <typename T>
auto only_return_int_type_foo(std::byte& b)
{
return std::to_integer<T>(b);
}
template <typename T>
auto only_return_int_type_bar(std::byte& b)
{
return T(b);
}
int main()
{
std::byte test{64};
// compiles
std::cout << only_return_int_type_foo<int>(test) << std::endl;
// compiler error
std::cout << only_return_int_type_foo<float>(test) << std::endl;
// compiles
std::cout << only_return_int_type_bar<int>(test) << std::endl;
// compiles
std::cout << only_return_int_type_bar<float>(test) << std::endl;
}
除了已经提到的意图和安全问题的表达之外,我从委员会对论文的讨论中了解到它应该像 std::to_string
并且将来可能会有更多的过载。
据我所知,std::to_integer<T>
等同于 T(value)
,其中 value
是类型为 std::byte
的变量。
我研究了主要编译器的一些实现,发现在这种情况下 等效 的字面意思是 实现为 。换句话说,大多数时候 to_integer
实际上实现为:
return T(value);
仅此而已。
我不明白的是这样一个功能的目的是什么?
具有讽刺意味的是,缺点甚至超过优点。我应该为这样一个函数包含一个完整的头文件,只是为了避免一个很可能直接内联的类似 C 的转换。
是否还有其他原因,或者它真的只是一个 漂亮的 类 C 演员表的替代品,仅此而已?
it's just really a nice looking alternative for a C-like cast and nothing more?
你说的好像是一些微不足道的细节。
强制转换很危险。将某些内容转换为错误的类型很容易,而且编译器通常不会阻止您这样做。此外,由于 std::byte
在 C++ 中不是整数类型,因此使用数字字节值通常需要进行大量转换。拥有一个显式转换为整数的函数可以提供更安全的用户体验。
例如,float(some_byte)
是完全合法的,而 to_integer<float>(some_byte)
是明确禁止的。 to_integer<T>
要求 T
是整数类型。
to_integer
是 更安全的 替代方案。
I should include a whole header for such a function
如果 "whole header",你的意思是 相同的 header 你从 std::byte
中得到,因此根据定义已经包括在内......
std::to_integer<T>(some_byte)
is equivalent to T(some_byte)
if it actually compiles. T(some_byte)
is equivalent to the unsafe C-style cast of (T)some_byte
, which can do scary things。另一方面,std::to_integer
被适当地限制为仅在安全时工作:
This overload only participates in overload resolution if
std::is_integral_v<IntegerType>
is true.
如果 T
实际上不是整数类型,而不是潜在的未定义行为,代码将无法编译。如果 some_byte
实际上不是 std::byte
,而不是潜在的未定义行为,代码将无法编译。
C 风格转换不等同于 std::to_integer<T>
。请参见下面的示例。
std::to_integer<T>
仅在 std::is_integral_v<T>
为真时参与重载决策。
#include <cstddef>
#include <iostream>
template <typename T>
auto only_return_int_type_foo(std::byte& b)
{
return std::to_integer<T>(b);
}
template <typename T>
auto only_return_int_type_bar(std::byte& b)
{
return T(b);
}
int main()
{
std::byte test{64};
// compiles
std::cout << only_return_int_type_foo<int>(test) << std::endl;
// compiler error
std::cout << only_return_int_type_foo<float>(test) << std::endl;
// compiles
std::cout << only_return_int_type_bar<int>(test) << std::endl;
// compiles
std::cout << only_return_int_type_bar<float>(test) << std::endl;
}
除了已经提到的意图和安全问题的表达之外,我从委员会对论文的讨论中了解到它应该像 std::to_string
并且将来可能会有更多的过载。