【问题标题】:Is every class, object, and function in c++ standard library declared under namespace std?c++ 标准库中的每个类、对象和函数是否都在命名空间 std 下声明?
【发布时间】:2014-10-31 04:03:06
【问题描述】:

基本上就是上面的问题。像 i_stream 这样的类以及 std 命名空间中包含的所有其他内容? istream 对象是否位于类 istream 内部?另外,如果没有必然发生任何命名冲突,为什么还有命名空间?

【问题讨论】:

  • 是的。尽管从c 继承的东西也是在全局范围内,但为了兼容性和易于实现。有一个命名空间来阻止它们与您的自己的类和函数(以及其他库的类和函数。例如,线性代数库可能有vector

标签: c++ class object namespaces std


【解决方案1】:

差不多了。

以下是我的 C++11 标准草案 [17.6.1.1,内容]:

除宏、operator new 和 operator delete 之外的所有库实体 在命名空间 std 或嵌套在命名空间内定义 命名空间标准。

所以 operator newoperator delete 被排除在外,即使它们是函数。

还有一个脚注,上面写着:

C 标准库头文件 [...] 还定义了名称 全局命名空间,而 C 库设施的 C++ 头文件 [...] 也可以在全局命名空间中定义名称。

这意味着您仍然拥有所有old (now deprecated) C headers,例如<string.h><stddef.h>。这些标头将函数放置在全局命名空间中,例如printfstrcpystrlen,仅举几例。

如果您使用这些标头的 C++ 等效项,即 <cstring><cstddef> 等,那么您将在 std 命名空间中获得这些函数,因此它们变为 std::printfstd::strcpy、@987654334 @ 等等。但是您可能也可以在全局命名空间中获取它们。

因此允许编译以下内容,并且在您使用自己喜欢的编译器尝试时可能会编译:

#include <cstdio>

int main()
{
    printf("Test\n");
    std::printf("Test\n");
}

而以下不会:

#include <stdio.h>

int main()
{
    printf("Test\n");
    std::printf("Test\n"); // error
}

关于您的相关问题:

如果没有必然发生的命名冲突,为什么还有命名空间?

发挥你的想象力:

Date CreateFromString(std::string const &string);

class OptionsFile
{
    std::map<std::string, std::string> list;
    // ...
};

class Buffer
{
    int count;
    // ...
};

Texture::Texture(char const *array);

enum Actions { find, sort };

struct Entity
{
    std::string copy;
};

【讨论】:

    【解决方案2】:

    关于标题中的问题,

    “ c++标准库中的每个类、对象和函数都声明在命名空间std下吗?

    没有。

    例如,全局operator new分配函数只在全局命名空间中。

    【讨论】:

    • 还有像std::chrono这样的子命名空间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多