sky*_*ack 8 c++ c++-standard-library c++17
据我所知,std::to_integer<T>相当于类型为的变量在T(value)哪里。
我研究了主要编译器的一些实现,发现在这种情况下,等效意味着从字面上实现为。换句话说,大多数时候实际上是这样实现的:valuestd::byteto_integer
return T(value);
Run Code Online (Sandbox Code Playgroud)
就这样。
我不明白这种功能的目的是什么?
具有讽刺意味的是,弊大于利。我应该为这样的函数包括一个完整的头文件,只是为了避免类似C的强制转换(无论如何很可能直接内联)。
还有其他原因吗,或者它真的像C转换一样好看,仅此而已?
Nic*_*las 12
对于像C的演员表,这真的是一个不错的选择,仅此而已?
您说的好像是一些琐碎的细节。
演员阵容很危险。将某些内容强制转换为错误的类型很容易,并且编译器通常不会阻止您执行此操作。此外,由于std::byte不是C ++中的整数类型,因此使用数字字节值通常需要进行大量转换。具有明确转换为整数的函数可提供更安全的用户体验。
例如,float(some_byte)完全合法,而to_integer<float>(some_byte)明确禁止。to_integer<T>要求T是整数类型。
to_integer是更安全的选择。
我应该为这样的功能包括整个头
如果“全部标头”是指您从中获得的标头std::byte,因此按定义已经包含...
std::to_integer<T>(some_byte)等效于T(some_byte) 它是否实际编译。T(some_byte)等同于不安全的C型强制转换(T)some_byte,它可以执行可怕的事情。另一方面,std::to_integer被适当地限制为仅在安全的情况下起作用:
如果
std::is_integral_v<IntegerType>为true,则此重载仅参与重载解决方案。
如果T实际上不是整数类型,而不是可能具有未定义的行为,则代码将无法编译。如果some_byte实际不是std::byte,而不是可能具有未定义的行为,则代码将无法编译。
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |