【发布时间】:2020-12-22 10:14:13
【问题描述】:
我试图理解 std::variant:
#include <cstdint>
#include <variant>
std::variant<int64_t, double> v;
我想分配一个 int64_t 变体:v = 5L;
这在 x86_64 上编译,因为 int64_t 很长。但它不能在 arm 上编译,因为 int64_t 很长。类型推导现在在 int64_t 和 double 之间有两个相等的选择来转换我的数字,所以它拒绝了。使用 variant
类似问题:v = 5LL; 现在 arm / 32 位很好,但 x86_64 不再可用。
我在两个平台上都进行了编译,但这(有时)是一种类型转换,具有我无法预见的潜在副作用:v = int64_t(5LL);。如果没有 LL,我什至无法表达 32 位整数之外的值。
INT64_C 宏似乎是表达这一点的最便携和最安全的方式:v = INT64_C(5);
但这已经不适合阅读和写作了。
对于 int64_t 是否有类似 L/LL 的字面后缀可移植?
【问题讨论】:
-
一个简单的解决方案是使用强制转换:
int64_t i = (int64_t)5;。 (而且它是完全可移植的,并在编译时解析。) -
这能回答你的问题吗? UL suffix vs uint32_t cast
-
另一种选择可能是自己定义一个文字运算符:SO: Fixed-width integer literals in C++?(我可以发誓我在某处读到它们可能会被添加到标准中......)
-
@scheff:我什至没想到 c-cast 会起作用,但它似乎起作用了。最后,我不想在 c++ 中使用 c-casts,而是可能会写 static_cast
(...) 。但是构造函数符号 int64_t(...);对眼睛更好,至少对我来说。整数文字方法似乎是前进的最佳方式,感谢您的提示。 -
我更喜欢 C-casts,因为我太老了,无法使用正确的 C++ casts。在大多数情况下(
dynamic_cast被排除在外,即使我已经习惯了)它会达到预期的效果...... ;-)
标签: c++ c++17 portability