【发布时间】:2023-03-03 04:14:01
【问题描述】:
考虑以下用于__uint128_t 的 GNU 扩展的类型特征的小型测试程序
#include <limits>
#include <type_traits>
using uint128_t = __uint128_t;
int main()
{
static_assert(std::is_unsigned<uint128_t>{}, "");
static_assert(std::is_integral<uint128_t>{}, "");
static_assert(std::numeric_limits<uint128_t>::digits == 128, "");
}
这适用于 g++ 和 libstdc++ (working example) 以及 clang++ 和 libc++ (working example),但不适用于 clang++ 和 libstdc++ (failing example) 的组合。
请注意,在所有 3 种情况下,我都使用 -std=gnu++1z 标志。
问题:哪种命令行参数组合可以成功编译我的带有libstdc++的clang++测试程序?
【问题讨论】:
-
这不是关于标准 C++,而是关于 GNUC++。 GCC 在
-std=c++1z模式下的静态断言也失败了。从标准的角度来看,GCC 定义这种类型的方式意味着它不是整数类型,只是一种恰好像整数类型一样工作的自定义类型,并且在符合标准的模式下,类型特征反映了这一点。 (我不确定 clang/libc++ 是如何定义它的。它可能在它们的实现中符合整数类型。) -
@hvd 请注意,在所有 3 个示例中,我都使用了
-std=gnu++1z,并且只有在 clang + libstdc++ 的情况下才会失败 -
我知道,我发表评论是为了澄清,而不是驳回您的问题。 :)
-
对于 Apple 平台上的
std::numeric_limits<uint128_t>,请参阅 Apple Clang and numeric_limits<unsigned __int128>::max() is 0?
标签: c++ g++ clang++ libstdc++ int128