小编Hyl*_*een的帖子

为什么 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()
}
Run Code Online (Sandbox Code Playgroud)

但是,当fun()在命名空间之外添加另一个函数(请参阅下面的代码)并在fun()没有前缀命名空间的情况下调用时,编译器会给出歧义错误。命名空间内的函数仍然可以通过显式添加命名空间前缀来调用,但fun()无法访问。当没有显式调用时,为什么编译器不喜欢命名空间之外的函数?是否有避免这种行为的具体原因?

// ^ Namespaces are still here

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

int main()
{
    fun(First::FIRST);  // …
Run Code Online (Sandbox Code Playgroud)

c++ argument-dependent-lookup

2
推荐指数
1
解决办法
49
查看次数

从结尾处开始从字符串中获取反向子字符串

是否存在C++ substr 的反向功能,它将char 0中的子字符串返回到给定的索引?我似乎无法在这里找到任何回答C++问题的帖子.我知道可以反转字符串然后使用substr,但我想知道是否有一个功能可以一步完成.

c++

0
推荐指数
1
解决办法
151
查看次数

标签 统计

c++ ×2

argument-dependent-lookup ×1