0

考虑以下 C++11 程序:

 #include <stdhdr1>
 #include <stdhdr2>
 #include <stdhdr3>

 using namespace std;

 #include <boost1>
 #include <boost2>
 #include <boost3>

 int main()
 {
 }

wherestdhdrn是标准库头文件,并且boostn是 boost 头文件。

是否存在无法编译的情况?

此外,考虑到 main 中的一些额外用户代码,是否存在因打开 std 命名空间而导致的歧义(或其他错误),无法通过明确限定歧义(或错误)实体来解决?

(例如,因为 ADL 考虑了开放的 std 命名空间还是其他?)

(换句话说,可以在打开的 std 命名空间之后包含 boost 句柄吗?)

4

1 回答 1

4

我不相信会有问题,因为std不包含名为 的命名空间boost,所以仍然不会有任何名称冲突。

至于 ADL:ADL 只考虑类类型的封闭命名空间。ADL 为 boost 类类型找到的任何函数都必须位于boost命名空间中的某个位置。

::std_entity只需对标准库实体和boost::boost_entityboost 实体执行操作,您就可以解析所有实体。

但是,如果不明确尝试,我想不出一个好方法来证明这一点。当然,避免任何问题的可靠方法是不做using namespace std;,如果你真的必须(你没有),只有在所有包含后才做。

于 2013-02-21T19:31:14.963 回答