条件noexcept和重载的不一致

时间:2017-05-03 15:29:35

标签: c++ c++11 templates argument-dependent-lookup noexcept

我遇到的问题与this非常相似。

简而言之,我有一个magic方法,如果另一种方法是noexcept,则为noexcept

奇怪的是,这个“另一个方法”有两个重载,编译器选择第二个重载来确定magic noexcept - ness。

但是,稍后调用magic时,会调用第一个重载,但noexcept的{​​{1}} - 依然保持不变!

这是wandbox link

据我所知:

  1. magic来电
  2. noexcept(magic(dummy2{}))可以追溯到
  3. noexcept(noexcept(adl_caller(...)),因为此时编译器不知道adl_caller(..., priority_tag<0>) noexcept
  4. 但是,user_method(dummy2)如何称为3行以上? 这是标准的意图吗?

    对不起,如果我不够清楚。

    user_method(dummy2)

1 个答案:

答案 0 :(得分:6)

[temp.point]/8

  

功能模板的专业化[...]可以   在翻译单元中有多个实例化点,和   除了上面描述的实例化点之外,对于任何   这种专业化有一个实例化点   翻译单位,翻译单位的结尾也被认为是   实例化点。 [...]如果有两个不同的实例化点   根据标准给出模板专业化的不同含义   一个定义的规则,该程序是不正确的,没有诊断   必需的。

比较[temp.dep.candidate]

  

对于 postfix-expression 是依赖项的函数调用   名称,使用通常的查找规则找到候选函数   ([basic.lookup.unqual],[basic.lookup.argdep])除了:

     
      
  • 对于使用非限定名称查找的查找部分,只能找到模板定义上下文中的函数声明。

  •   
  • 对于使用关联命名空间([basic.lookup.argdep])查找的部分,只能在任一个中找到函数声明   模板定义上下文或模板实例化上下文   找到了。

  •   
     

如果调用结果不正确或者找到更好的匹配,则相关命名空间中的查找会考虑所有功能   在这些名称空间中引入外部链接的声明   所有翻译单位,而不仅仅是考虑那些发现的声明   然后,在模板定义和模板实例化上下文中   该程序有不确定的行为。