为什么这个static_assert只在OSX上以clang失败,而在其他地方却没有
Why does this static_assert only fail with clang on OS X and nowhere else?
以下代码:
#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
。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 视图中的参数推导失败:take_while
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- isalpha()?或其他.. Debug断言失败了,CircleMud游戏
- C GTEST在测试结束时仅在测试失败时打印其他信息
- 谷歌测试:如果测试失败,则执行其他操作
- 为什么这个static_assert只在OSX上以clang失败,而在其他地方却没有
- PostgreSQL打开其他数据库失败
- 为什么TopoSort只在某些图上有效,而在其他图上失败
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- C++11 指向同一基类的其他类的指针的非静态数据成员统一初始化失败
- ::createFile winApi 失败,出现错误 5 (access_denied).是外壳编程或其他解决方案或任
- 只有在其他重载失败时才使用模板重载