为什么ADL无法与在命名空间之外定义的函数一起使用?

海尔克

我知道下面的示例中的编译器将执行该函数First::fun(),因为依赖于参数的名称查找(ADL)/ Koenig查找,并且要执行Second::fun()此功能,需要在main函数中显式调用该函数。

#include <iostream>
using namespace std;

namespace First
{
    enum Enum
    {
        FIRST
    };

    void fun(First::Enum symbol)
    {
        cout << "First fun\n";
    }
}

namespace Second
{
    void fun(First::Enum symbol)
    {
        cout << "Second fun\n";
    }
}

int main()
{
    fun(First::FIRST);  // Calls First::fun()
}

但是,在fun()命名空间之外添加另一个函数(请参见下面的代码)并在fun()没有前缀命名空间的情况下调用时,编译器会产生歧义错误。仍可以通过显式为名称空间添加前缀来调用名称空间中的函数,但是这些功能fun()是不可访问的。当没有显式调用命名空间时,为什么编译器不喜欢该函数呢?是否有避免此行为的特定原因?

// ^ Namespaces are still here

fun(First::Enum symbol)
{
    cout << "No namespace fun\n";
}    

int main()
{
    fun(First::FIRST);  // Doesn't compile: ambiguity!
}

编辑

正如Yksisarvinen正确指出的那样,fun()仍可以通过在全局名称空间前面加上前缀来调用全局变量::fun(First::FIRST);

但是,这仍然给我一个问题:为什么编译器fun()在模棱两可的调用中不喜欢全局变量?

songyuanyao

为什么编译器fun()在歧义调用中不喜欢全局变量?

全局fun通过非限定名称查找First::fun找到,并通过ADL找到,两者都放入重载集中,并且重载解析不能选择一个。

除了通常的非限定名称查找所考虑的范围和名称空间之外,还在其参数的名称空间中查找这些函数名称。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么ADL无法与在命名空间之外定义的函数一起使用?

来自分类Dev

为什么ADL无法与Boost.Range一起使用?

来自分类Dev

为什么decltype无法与重载函数一起使用?

来自分类Dev

为什么速记函数与类一起使用会导致“ this”未定义?

来自分类Dev

为什么ResultSet.deleteRow()无法与使用Trim()函数的查询一起使用

来自分类Dev

为什么ng-hide无法与自定义指令一起使用?

来自分类Dev

为什么我的代码无法与自定义分配器一起使用?

来自分类Dev

为什么ng-hide无法与自定义指令一起使用?

来自分类Dev

如何在纯JavaScript函数中将i18next与命名空间一起使用?

来自分类Dev

为什么URI路径无法与File一起使用?

来自分类Dev

为什么.includes()无法与.classList一起使用?

来自分类Dev

为什么DbFunctions无法与Linq to Entries一起使用

来自分类Dev

为什么grep无法与重定向一起使用?

来自分类Dev

为什么@Transactional无法与@Autowired EntityManagerFactory一起使用?

来自分类Dev

为什么rand无法与AbstractFloat一起使用?

来自分类Dev

为什么pkill无法与rofi一起使用?

来自分类Dev

为什么@Resource无法与@PreAuthorize一起使用

来自分类Dev

为什么$ .ajaxSetup无法与$ .post一起使用

来自分类Dev

为什么PanResponder无法与useEffect Hook一起使用?

来自分类Dev

为什么grep无法与重定向一起使用?

来自分类Dev

为什么eval()无法与数组一起使用

来自分类Dev

为什么Pinterest API无法与$ .getJSON一起使用

来自分类Dev

为什么mkdir无法与GString一起使用?

来自分类Dev

为什么setTimeout无法与.hover()一起使用?

来自分类Dev

为什么URI路径无法与File一起使用?

来自分类Dev

为什么mkdir无法与通配符一起使用?

来自分类Dev

为什么live()无法与jQuery一起使用?

来自分类Dev

将RecursiveIteratorIterator与命名空间一起使用?

来自分类Dev

为什么@forward命名前缀不能与使用Sass的变量一起使用?

Related 相关文章

  1. 1

    为什么ADL无法与在命名空间之外定义的函数一起使用?

  2. 2

    为什么ADL无法与Boost.Range一起使用?

  3. 3

    为什么decltype无法与重载函数一起使用?

  4. 4

    为什么速记函数与类一起使用会导致“ this”未定义?

  5. 5

    为什么ResultSet.deleteRow()无法与使用Trim()函数的查询一起使用

  6. 6

    为什么ng-hide无法与自定义指令一起使用?

  7. 7

    为什么我的代码无法与自定义分配器一起使用?

  8. 8

    为什么ng-hide无法与自定义指令一起使用?

  9. 9

    如何在纯JavaScript函数中将i18next与命名空间一起使用?

  10. 10

    为什么URI路径无法与File一起使用?

  11. 11

    为什么.includes()无法与.classList一起使用?

  12. 12

    为什么DbFunctions无法与Linq to Entries一起使用

  13. 13

    为什么grep无法与重定向一起使用?

  14. 14

    为什么@Transactional无法与@Autowired EntityManagerFactory一起使用?

  15. 15

    为什么rand无法与AbstractFloat一起使用?

  16. 16

    为什么pkill无法与rofi一起使用?

  17. 17

    为什么@Resource无法与@PreAuthorize一起使用

  18. 18

    为什么$ .ajaxSetup无法与$ .post一起使用

  19. 19

    为什么PanResponder无法与useEffect Hook一起使用?

  20. 20

    为什么grep无法与重定向一起使用?

  21. 21

    为什么eval()无法与数组一起使用

  22. 22

    为什么Pinterest API无法与$ .getJSON一起使用

  23. 23

    为什么mkdir无法与GString一起使用?

  24. 24

    为什么setTimeout无法与.hover()一起使用?

  25. 25

    为什么URI路径无法与File一起使用?

  26. 26

    为什么mkdir无法与通配符一起使用?

  27. 27

    为什么live()无法与jQuery一起使用?

  28. 28

    将RecursiveIteratorIterator与命名空间一起使用?

  29. 29

    为什么@forward命名前缀不能与使用Sass的变量一起使用?

热门标签

归档