如何使用未作用域的枚举器,就好像它的类型是它的底层类型一样

JAH*_*JAH 3 c++

这不能按预期工作:

template<typename T>
struct PHI {
    enum : T { value = 11400714819323198485 >> (64 - sizeof(T) * 8) };
};

std::cout << PHI<unsigned long long>::value;
Run Code Online (Sandbox Code Playgroud)

输出是2135587861.我的期望是什么11400714819323198485.(在VS2013中)

我想如果需要PHI<unsigned long long>::value可以隐式转换为类型unsigned long long.但它实际上转换为unsigned.这意味着当我在其他地方使用它时,它也可能转换为unsigned.那不是我想要的.

T.C*_*.C. 5

让我们摆脱模板.最小化的repro:

#include <iostream>

enum bar : unsigned long long { baz = 11400714819323198485ULL };

void foo(int v) { std::cout << "int "<< v; }
void foo(unsigned v) { std::cout << "uint " << v; }
void foo(unsigned long long v) { std::cout << "ull " << v; }

int main() { foo(baz); }
Run Code Online (Sandbox Code Playgroud)

这打印uint 2135587861.

与此同时,

#include <iostream>

enum bar : unsigned long long { baz = 11400714819323198485ULL };

void foo(unsigned long long v) { std::cout << "ull " << v; }

int main() { foo(baz); }
Run Code Online (Sandbox Code Playgroud)

打印ull 11400714819323198485.因此保留了该值,并且可以完成转换.这看起来像是VC++重载决策中的一个错误.这也在VS2015 CTP5中重现.

编辑:报告为https://connect.microsoft.com/VisualStudio/feedback/details/1131433

最短的解决方法似乎正在使用foo(+baz); 在+执行重载解析之前,一元力量是一个整体提升.