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 并且将来可能会有更多的过载。