Clang和GCC中模棱两可的基类转换之间的行为差异

0x499602D2

以下内容-1GCC 4.9,VC ++中打印2Clang 3.5中打印

template <int n>
struct base { static constexpr int value = n; };

struct A : base<0> { };
struct B : base<1> { };
struct C : base<2> { };

struct D : A, B, C { };

template <int n>
base<n> base_cast(base<n>);

template <typename T, typename B = decltype(base_cast(std::declval<T>()))>
std::integral_constant<int, B::value> f(int);

template <typename T>
std::integral_constant<int, -1> f(...);

constexpr int value = decltype(f<D>(0))::value;

int main()
{
    std::cout << value << std::endl;
}

我说铛不正确,因为有多个转换Dbase<n>:通过ABCclang所做的奇怪的事情是,它似乎转换为其基本说明符列表中最后一个基类。

这是Clang中的错误吗?我可以从标准中获得实际用语吗?

克里希纳·阿舒丹(Krishna Achuthan)

标准中的第4条涉及标准转换:

4.2 [注:具有给定类型的表达式将在几种情况下隐式转换为其他类型:

—用作初始化的源表达式(包括用作函数调用中的参数和用作return语句中的表达式)。被初始化的实体的类型(通常)是目标类型。见8.5,8.5.3。

—尾注]

4.3当且仅当声明T t = e时,表达式e才能隐式转换为类型T;格式正确,对于某些发明的临时变量t(8.5)


基于此D可以转换为base <0>,base <1>和base <2>。

base<0> b0 = D(); //compiles
base<1> b1 = D(); //compiles
base<2> b2 = D(); //compiles

由于存在三种可能的转换,因此对base_cast的调用应导致模棱两可的调用。


以下代码段:

template <int n>
void print_base(base<n>)
{
   std::cout << n << std::endl;
}
...
print_base(D());

在gcc 4.7.2中给出以下错误:

error: no matching function for call to 'print_base(D)'
 note: candidate is:
 note: template<int n> void print_base(base<n>)
 note:   template argument deduction/substitution failed:
 note:   'D' is an ambiguous base class of 'base<n>'


错误消息在这里似乎有点偏离:'D'是base <n>的模棱两可的“ base”类,但是它传达了这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多继承模棱两可的基类

来自分类Dev

Java ==行为模棱两可

来自分类Dev

Lang和requestLang中的模棱两可的值

来自分类Dev

vs 2013和GCC之间的全局函数和模棱两可的参数NULL vs. char *

来自分类Dev

无效的方法引用/模棱两可的引用(javac / ecj行为差异)

来自分类Dev

将模棱两可的CFG转换为模棱两可的CFG

来自分类Dev

困惑于将模棱两可的语法转换为模棱两可的语法

来自分类Dev

C ++临时类实例模棱两可

来自分类Dev

枚举类模棱两可的继承

来自分类Dev

Akka HTTP模棱两可的隐式转换

来自分类Dev

gcc中的模棱两可的重载,与msvc一起使用

来自分类Dev

带有自己的类和std :: string_view的'operator =='的模棱两可的重载

来自分类Dev

模棱两可的重载,隐式转换和显式构造函数

来自分类Dev

模棱两可的重载,隐式转换和显式构造函数

来自分类Dev

C ++ Cout,Cin和系统“模棱两可”

来自分类Dev

SQLAlchemy JOIN和模棱两可的列名

来自分类Dev

模棱两可的意图和槽位填充

来自分类Dev

.ctor模棱两可,因为类中存在多种使用此名称的成员

来自分类Dev

xpath [last()]方法中的模棱两可的错误

来自分类Dev

'std :: cin >>'中'operator >>'的模棱两可的重载

来自分类Dev

在C#中返回模棱两可的对象

来自分类Dev

gcc vs clang-使用`make_overload`可变参数Lambda继承时的模棱两可的重载

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

PHP和MYSQL:如何在子查询中解析模棱两可的列名

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

模棱两可的外部联接?

来自分类Dev

模棱两可的varargs方法

来自分类Dev

解决模棱两可的模板

来自分类Dev

For循环增强,但模棱两可

Related 相关文章

  1. 1

    多继承模棱两可的基类

  2. 2

    Java ==行为模棱两可

  3. 3

    Lang和requestLang中的模棱两可的值

  4. 4

    vs 2013和GCC之间的全局函数和模棱两可的参数NULL vs. char *

  5. 5

    无效的方法引用/模棱两可的引用(javac / ecj行为差异)

  6. 6

    将模棱两可的CFG转换为模棱两可的CFG

  7. 7

    困惑于将模棱两可的语法转换为模棱两可的语法

  8. 8

    C ++临时类实例模棱两可

  9. 9

    枚举类模棱两可的继承

  10. 10

    Akka HTTP模棱两可的隐式转换

  11. 11

    gcc中的模棱两可的重载,与msvc一起使用

  12. 12

    带有自己的类和std :: string_view的'operator =='的模棱两可的重载

  13. 13

    模棱两可的重载,隐式转换和显式构造函数

  14. 14

    模棱两可的重载,隐式转换和显式构造函数

  15. 15

    C ++ Cout,Cin和系统“模棱两可”

  16. 16

    SQLAlchemy JOIN和模棱两可的列名

  17. 17

    模棱两可的意图和槽位填充

  18. 18

    .ctor模棱两可,因为类中存在多种使用此名称的成员

  19. 19

    xpath [last()]方法中的模棱两可的错误

  20. 20

    'std :: cin >>'中'operator >>'的模棱两可的重载

  21. 21

    在C#中返回模棱两可的对象

  22. 22

    gcc vs clang-使用`make_overload`可变参数Lambda继承时的模棱两可的重载

  23. 23

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  24. 24

    PHP和MYSQL:如何在子查询中解析模棱两可的列名

  25. 25

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  26. 26

    模棱两可的外部联接?

  27. 27

    模棱两可的varargs方法

  28. 28

    解决模棱两可的模板

  29. 29

    For循环增强,但模棱两可

热门标签

归档