gpt4 book ai didi

c++ - 在我自己的命名空间中定义 size_t 会产生歧义或其他错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:47 25 4
gpt4 key购买 nike

我有以下定义 size_t 的代码相当于std::size_t::size_t如果我包括 <cstddef> .

// h.hpp
namespace N {
using size_t = decltype(sizeof(int));
}
// a.hpp
#include <h.hpp>
namespace N {
class C {
size_t size() const;
};
void f(size_t);
}
// ^^^ These use N::size_t!

这是否以任何方式违反了 C++ 标准,这是否会导致使用这些 header 和定义 std::size_t 的任何其他标准 header 的任何代码出现错误?和 ::size_t ? 如果有人不能使用 std::size_t,我也会认为这是一个错误和 N::size_t在任何情况下都可以互换,或者如果只使用 size_t在任何情况下都会引起歧义。

// someOtherFile.cpp
#include <a.hpp>
#include <cstdint>
namespace N {
// Can there be any problem here? (Inside N::)
}
// Or here? (Outside N::)

我的猜测是不,因为我的和标准的 size_t只是 unsigned long (long) int 的类型别名

最佳答案

您的别名不会造成任何问题。它出现在它自己的命名空间范围内,所以别名声明不会重新声明任何东西。即使客户端代码会不负责任地做一些顽皮的事情,比如:

using namespace std;
using namespace N;

size_t foo;

这仍然很好,因为 size_t 是相同的类型,无论别名来自哪个命名空间。仅当来自不同 namespace 的相同名称引用不同 实体时,名称查找才会失败:

[namespace.udir]

6 If name lookup finds a declaration for a name in two different namespaces, and the declarations do not declare the same entity and do not declare functions, the use of the name is ill-formed.

根据 C++ 标准,“实体”涵盖范围广泛的事物,包括类型。这就是症结所在,因为类型别名不是类型,它只是现有类型的新名称。所以这两个(非限定的)别名命名相同的东西。

关于c++ - 在我自己的命名空间中定义 size_t 会产生歧义或其他错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55626881/

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