以下代码:
#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, "");
Run Code Online (Sandbox Code Playgroud)
无法使用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
Run Code Online (Sandbox Code Playgroud)
但是,同样的文件可以在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
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?这显然似乎是我系统中的一个错误,但是我不清楚为什么这会因为Xcode的clang而不是任何其他版本的clang而失败.Xcode的clang分布是否有明显不同?
这不是一个bug; 该行为是由标准强制执行的.[meta.trans.sign]对枚举案说
type应命名具有最小等级([conv.rank])的无符号整数类型,其sizeof(T) == sizeof(type)具有与之相同的cv限定符T.
在平台中sizeof(unsigned long long) == sizeof (unsigned long),std::uint64_t可以定义为,但std::make_unsigned<Enum>::type必须命名unsigned long.