gpt4 book ai didi

c++ - 由于使用了一种内部类型而将命名空间设置为已使用?

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:10 24 4
gpt4 key购买 nike

我刚刚注意到了这一点。我不知道为什么会这样,如果我使用 namespace 中的一个元素,我不希望在不使用 namespace 的情况下访问任何其他元素。例如这里,这段代码是有效的:

namespace Test
{
struct Magic
{
int poof;
};

struct Magic2
{
int poof;
};

int Alakazam(const Magic& m)
{
return m.poof;
}

int Alakazam(const Magic2& m)
{
return m.poof;
}
};

using Magic = Test::Magic;

int main()
{

Alakazam(Magic()); // valid
Alakazam(Test::Magic2()); // valid

Test::Alakazam(Magic()); // what i want to only be valid
Test::Alakazam(Test::Magic2()); // this too
}

这背后有什么原因吗?规范是否规定这必须是真实的?

最佳答案

正如 immbis 在评论中所建议的,这是由标准定义的:

3.4.2: Argument dependent name lookup

  1. When the postfix-expression in a function call is an unqualified-id, other namespaces not considered during the usual unqualified lookup may be searched, and in those namespaces, namespace-scope friend function or function template declarations not otherwise visible may be found. These modifications to the search depend on the types of the arguments (and for template template arguments, the namespace of the template argument).

    ...

如果你想打败这个机制,你必须像这样使用嵌套的命名空间,但这很棘手:

namespace Test
{
struct Magic
{
int poof;
};
struct Magic2
{
int poof;
};

namespace Test2 { // use a nested namespace that will not be searched autoamtically
int Alakazam(const Magic& m)
{
return m.poof;
}

int Alakazam(const Magic2& m)
{
return m.poof;
}
}
using namespace Test2; // but give some access to the enclosing namespace
};

Live Demo : 那么,您的前两次通话将不再有效。但是,您的示例中的最后一次调用仍然是可能的:您不能阻止在命名空间之外使用完全限定名称。

关于c++ - 由于使用了一种内部类型而将命名空间设置为已使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34800750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com