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

模板实例化,两阶段名称查找,具有自动推导类型的不同行为

如何解决《模板实例化,两阶段名称查找,具有自动推导类型的不同行为》经验,为你挑选了0个好方法。

看到这个问题后,什么时候检查了C++模板实例化类型?并且在相当长的一段时间里,我开始用代码来吸收知识.答案给出了明确和正确的解释.它提到了两阶段名称查找以及翻译单元结束也被视为功能模板实例化的事实.但是我在使用自动返回类型推导时观察到不同的行为:

这就像原始代码.这是正确的,并按照链接帖子中的解释工作:

class A;
class B;

template  auto foo() -> T * {
  A *pa = nullptr; // ignore pa being `nullptr`.
  return static_cast(pa);
}

auto test() { return foo(); }

class A {};
class B : public A {};

对模板使用自动返回类型推导fooA,B必须在实例化点之前出现和的定义foo:

不工作:

class A;
class B;

template  auto foo()  { // automatic return type deduction
  A *pa = nullptr;
  return static_cast(pa);
}

auto test() { return foo(); }

class A {};
class B : public A {};

gcc(4.9和5.2.1)的错误:

错误:从类型'A*'到类型'B*'的static_cast无效

Clang给出了类似的错误

工作:

class A;
class B;

template  auto foo()  { // automatic return type deduction
  A *pa = nullptr;
  return static_cast(pa);
}

class A {};
class B : public A {};

auto test() { return foo(); }

为什么会这样?为什么关于编译单元的结束被认为是实例化点的规则不会使模板实例化合法化了?

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有