2016-05-24 9 views
1

次のコード:なぜこのstatic_assertはOS X上のclangだけで失敗するのですか?

#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, ""); 

が打ち鳴らすと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 

しかし、この同じファイルが打ち鳴らす3.8/3.7.1/3.7/3.6/3.5で大丈夫動作します。 1/3.5/3.4.1/3.3 on gcc.godbolt.org。私のシステムで

、打ち鳴らすには、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のクラン分布は大きく異なりますか?

答えて

5

これはバグではありません。その振る舞いは標準によって義務付けられています。 [meta.trans.sign]Tとして 同じCV-修飾子とsizeof(T) == sizeof(type)の最小 ランク([conv.rank])と符号なし整数型を、名前を付けなければならない列挙ケース

typeため言います。 sizeof(unsigned long long) == sizeof (unsigned long)プラットフォームで

std::uint64_tは、いずれかとして定義することができるが、std::make_unsigned<Enum>::typeunsigned longに名前を付ける必要があります。

関連する問題