为什么这个static_assert只在OSX上以clang失败,而在其他地方却没有

Why does this static_assert only fail with clang on OS X and nowhere else?

本文关键字:失败 其他 方却没 clang 上以 static assert OSX 只在 为什么      更新时间:2023-10-16

以下代码:

#include <cstdint>
#include <type_traits>
enum class Enum : std::uint64_t {
zero,
};
static_assert(std::is_same<std::make_unsigned<Enum>::type, std::uint64_t>::value, "");

无法在带有clang的OS X上编译:

$ clang++ -std=c++11 -c t.cpp
t.cpp:8:1: error: static_assert failed ""
static_assert(std::is_same<std::make_unsigned<Enum>::type, std::uint64_t>::value, "");
^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated

然而,这个文件与gcc.godbolt.org上的clang 3.8/3.7.1/3.7/3.6/3.5.1/3.5/3.4.1/3.3可以正常工作。

在我的系统上,clang只是Xcode 7.3.1:的正常版本

$ clang++ --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

什么东西?这显然是我系统中clang中的一个错误,但我不清楚为什么Xcode中的clang会失败,而其他版本的clang却不会。Xcode的clang分布是否显著不同?

这不是一个bug;该行为是由标准强制执行的。[meta.trans.sign]表示枚举情况为

type应命名最小的无符号整数类型秩([conv.rank]),其中sizeof(T) == sizeof(type)与CCD_ 3相同的cv限定符。

sizeof(unsigned long long) == sizeof (unsigned long)std::uint64_t可以定义为任意一个的平台中,但std::make_unsigned<Enum>::type必须命名为unsigned long