当前位置:  开发笔记 > 编程语言 > 正文

使用枚举基因编写枚举时会出现模糊的重载,但只能使用clang

如何解决《使用枚举基因编写枚举时会出现模糊的重载,但只能使用clang》经验,为你挑选了1个好方法。

我想使用operator <<来编写具有指定基类型的枚举.令我惊讶的是,似乎我必须自己写出操作员.例如,我想写的代码是

#include 
enum myenum : uint16_t
{
    X = 0,
};
int main ()
{
    std::cout << "Value is" << X << std::endl;
    return 0;
}

gcc 4.8和visual studio 2015对此没有任何问题.clang ++ - 3.6错误

# clang++-3.6 -std=c++11 -O0 ostream.cpp -o test.exe
ostream.cpp:18:29: error: use of overloaded operator '<<' is ambiguous (with operand types
      'basic_ostream >' and 'myenum')
    std::cout << "Value is" << X << std::endl;
    ~~~~~~~~~~~~~~~~~~~~~~~ ^  ~
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:181:7: note: 
      candidate function
      operator<<(unsigned short __n)
      ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:189:7: note: 
      candidate function
      operator<<(int __n);
      ^
      ... another 14 candidates along the same lines ...

总的来说,在严格的一致性方面,我倾向于相信铿锵,所以也许这种用法确实很模糊.枚举当然可以转换为其他种类的整数.我希望编译器更喜欢与枚举的基本类型相对应的版本.

我可以通过使用其他语言功能而不是enum ...:uint16_t或通过显式输入运算符来处理,在这种情况下clang也是内容.

static inline std::ostream & operator<<(std::ostream & out, myenum const & s)
{
    out << static_cast::type> (s);
    return out;
}

这看起来很荒谬.clang的行为是预期的还是错误的?



1> T.C...:

Clang问题.最小化的repro:

enum myenum : unsigned short
{
    X = 0,
};

void f(unsigned short);
void f(int);
int main ()
{
    f(X);
    return 0;
}

[conv.prom]/4:

其基础类型为固定(7.2)的未作用域枚举类型的prvalue可以转换为其基础类型的prvalue.此外,如果可以对其基础类型应用整数提升,则其基础类型固定的无范围枚举类型的prvalue也可以转换为提升的基础类型的prvalue.

[over.ics.rank] /4.2-这个子弹由CWG1601添加为针对C++ 11的DR:

标准转化顺序按其排名排序:完全匹配是比促销更好的转化,这是一种比转化更好的转化.除非符合以下规则之一,否则具有相同等级的两个转换序列无法区分:

[...]

如果两者不同,那么促进其基础类型固定为其基础类型的枚举的转换优于促进提升的基础类型的转换.

myenum- > unsigned shortmyenum- > int具有相同的等级(促销).Per [over.ics.rank] /4.2,第一个优于第二个.这里没有歧义.

OTOH,GCC默默地调用错误的重载(int一个),这并没有那么好.


DR 1601的解决方案使其成为C++ 14,所以现在两个编译器都明确错误了......
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有