gpt4 book ai didi

从另一个命名空间内访问 C++ 全局命名空间

转载 作者:可可西里 更新时间:2023-11-01 16:38:21 26 4
gpt4 key购买 nike

在下面的 C++ 代码中,foobar 首先为单个 double 参数定义,然后再次为类型为 Foo 的单个参数定义.两者都在全局命名空间中定义。

one 命名空间中,定义了 foobar 的进一步重载,具有 Bar 类型的单个参数。从这个版本的 foobar 开始,使用 double 参数 (42.0) 对 foobar 的非限定调用将失败。对 foobar 的类似调用,这次使用 (::) 范围解析运算符限定,还使用 ​​double 参数,但会成功。

另一方面,使用类型为 Foo 的参数对 foobar 的非限定调用会成功。使用范围解析运算符限定的 Foo 参数调用 foobar 也会成功。

为什么这两种情况的表现不同?我同时使用 gcc 4.7 和 clang++ 3.2。

struct Foo {};
struct Bar {};

double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }

namespace one {

Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);

Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};

最佳答案

Argument dependent lookup .

在调用 foobar(f) 函数时,将考虑 Foo 的命名空间。

不适用于 double,因为该类型未在任何命名空间中声明。

关于从另一个命名空间内访问 C++ 全局命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11873790/

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