我遇到的问题与this非常相似。
简而言之,我有一个magic
方法,如果另一种方法是noexcept
,则为noexcept
。
奇怪的是,这个“另一个方法”有两个重载,编译器选择第二个重载来确定magic
noexcept
- ness。
但是,稍后调用magic
时,会调用第一个重载,但noexcept
的{{1}} - 依然保持不变!
这是wandbox link
据我所知:
magic
来电noexcept(magic(dummy2{}))
可以追溯到noexcept(noexcept(adl_caller(...))
,因为此时编译器不知道adl_caller(..., priority_tag<0>) noexcept
。但是,user_method(dummy2)
如何称为3行以上?
这是标准的意图吗?
对不起,如果我不够清楚。
user_method(dummy2)
答案 0 :(得分:6)
功能模板的专业化[...]可以 在翻译单元中有多个实例化点,和 除了上面描述的实例化点之外,对于任何 这种专业化有一个实例化点 翻译单位,翻译单位的结尾也被认为是 实例化点。 [...]如果有两个不同的实例化点 根据标准给出模板专业化的不同含义 一个定义的规则,该程序是不正确的,没有诊断 必需的。
对于 postfix-expression 是依赖项的函数调用 名称,使用通常的查找规则找到候选函数 ([basic.lookup.unqual],[basic.lookup.argdep])除了:
对于使用非限定名称查找的查找部分,只能找到模板定义上下文中的函数声明。
对于使用关联命名空间([basic.lookup.argdep])查找的部分,只能在任一个中找到函数声明 模板定义上下文或模板实例化上下文 找到了。
如果调用结果不正确或者找到更好的匹配,则相关命名空间中的查找会考虑所有功能 在这些名称空间中引入外部链接的声明 所有翻译单位,而不仅仅是考虑那些发现的声明 然后,在模板定义和模板实例化上下文中 该程序有不确定的行为。