扩展 std 命名空间被视为未定义行为的原因是什么?

2024-04-13

为什么要添加名字std命名空间未定义的行为?

显而易见的答案是“因为标准是这么说的”,例如在 C++14 [命名空间.std] 17.6.4.2.1/1 中:

如果 C++ 程序向命名空间添加声明或定义,则其行为是未定义的std或到一个 命名空间内的命名空间std除非另有规定。 ...

然而,我真的很想知道这个裁决的原因。我当然可以理解添加已经存在的名称的重载std可能会破坏行为;但为什么添加新的、不相关的名称会成为问题呢?

程序已经可以在内部造成严重破坏std使用宏,这就是为什么几乎所有标准库实现都必须仅包含所有非公共部分的保留名称(双下划线和下划线开头的大写字母)。

我真的对这样的情况可能会出现问题很感兴趣:

namespace std
{
  int foo(int i)
  { return i * 42; }
}

#include <algorithm>  // or one or more other standard library headers

当这是完全合法的并且标准库必须应对时:

#define foo %%

#include <algorithm>  // or one or more other standard library headers

这种未定义行为的理由是什么?


以下是几个原因:

  1. 即使名字在headers必须进行丑化以避免与宏交互,但实际实现代码的源文件中的名称不存在此要求。如果一个实现确实使用了::std::foo(int)作为其实施的一部分,这将违反单一定义规则。
  2. 该标准预计会不断增长。名称是否可以添加到命名空间std添加到标准 C++ 库中的任何名称都可能是重大更改。在某种程度上,这已经是正确的,因为任何这样的名称都可以是宏,但破坏这些名称被认为是可以接受的。
  3. 实际上不需要将名称添加到命名空间std:它们可以添加到任意其他名称空间,即,即使上面给出的动机不是特别强烈,任何形式的限制都不被认为是重要的。 ...如果有的话is将名称添加到命名空间的原因std, 很明显does影响行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展 std 命名空间被视为未定义行为的原因是什么? 的相关文章

随机推荐

  • 想用jsp显示文件列表

    我是使用 glassfish 服务器的 netbeans 新手 我的 html 代码如下所示
  • 如何在 PHP 中包含一个类 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有文件index php 我想包含文件class twitter php在里面 我怎样才能做到这一点 希望当我将以下代码放入 index
  • TFS 构建服务器 - CSC:致命错误 CS2008:未指定输入

    当我们构建解决方案或错误引用的特定项目时 我们会在构建服务器上收到上述错误消息 我们可以使用 Visual Studio 也在构建服务器上 毫无问题地构建解决方案 但是在运行 msbuild 时会失败并出现上述错误 有任何想法吗 我找到了解
  • 在多个生命周期中运行 Maven 目标

    我有一个情况 我想在验证阶段和报告阶段运行 cobertura 插件 我有两个配置文件 它们都应该运行 cobertura 插件 但在配置文件 A 中 我只想创建 xml html 输出 但在配置文件 B 中 我将生成包含这些结果的完整站点
  • Selenium C# DefaultWait IgnoreExceptionTypes 不起作用

    我在等待 WebElement 可单击时使用 DefaultWait 尽管 TargetIncationException 是等待期间要忽略的异常列表中的异常之一 但在达到超时期限之前 我仍然有测试因该异常而失败 这不是我所期望的 publ
  • Linux下如何用C实现定时器的回调函数

    我已经在许多论坛上搜索了几天可能的解决方案 但没有运气 我在这里发布我的问题 非常感谢您的回复 主意 使用脚本控制灯光 Linux下C语言 应用场景 我有三盏灯 红 蓝 绿 脚本有控制它们的时间表 例如 从现在起10秒后 亮红灯2秒 从现在
  • 组合框 - 键入选择,然后单击焦点外 - 不会选择键入的项目

    我的组合框有问题 我有一个事件处理程序OnClick它根据选择的项目刷新数据 问题是当这种情况发生时 下拉组合框列出各种选项 在键盘上键入以查找匹配的项目 组合框更改此选择并调用OnClick event 由于此选择 事件 我的屏幕刷新 单
  • 如何使用reactJs根据背景颜色更改字体颜色

    我的容器有动态背景 它将由用户更改 因此我需要根据背景颜色设置文本颜色 例如 我设置容器的黑色背景 然后我需要为文本设置白色 我正在为我的应用程序使用 ReactJs 和材料 UI 库 请建议一些好的路径 请参阅下面的示例代码 import
  • 尝试加载方向变化的新视图

    我正在尝试在 Xcode 中创建一个应用程序 当手机从一个方向旋转到另一个方向时 该应用程序将切换到新视图 这是 switchviewcontroller h 文件代码 import
  • 下标变量

    有没有什么方法可以强制 Mathematica 独立于无下标变量来处理下标变量 进一步来说 比如说 我有以下定义 Subscript b 1 1 2 Subscript b 2 3 4 b Join Subscript b 1 Subscr
  • VS .Net:在安装程序项目中发布“来自 的主要输出”的构建事件

    我在项目中使用以下构建后操作 将库合并到我的应用程序中 IF ConfigurationName Debug GOTO end cp TargetPath TargetDir app unmerged exe del TargetPath
  • 将对象序列化为 XML

    我有一个继承的 C 类 我已经成功地 构建 了该对象 但我需要将对象序列化为 XML 有简单的方法吗 看起来该类已设置为序列化 但我不确定如何获取 XML 表示形式 我的类定义如下 System CodeDom Compiler Gener
  • ARC 是否保留无主引用的计数?

    ARC 是否保留对对象的无主引用的计数 那么 如果一个对象的强引用计数达到 0 并且该对象的无主引用计数 gt 0 则该对象将被取消初始化但不会被取消分配 只有当强引用计数和无主引用计数达到 0 时 它才会被释放 我在 Medium 上的一
  • GCC 错误:非命名空间范围中的显式专业化

    我正在尝试移植以下代码 我知道该标准不允许在非名称空间范围内显式专业化 我应该使用重载 但我只是找不到在这种特殊情况下应用此技术的方法 class VarData public template lt typename T gt bool
  • vs2008/vs2010 在 TextBox 中是否有插入符位置更改事件?

    我需要留意文本框内的插入符号位置 有这方面的活动吗 我不想为此使用计时器 例如 每 10 毫秒检查一次位置是否发生变化 我正在使用 Windows 窗体 本机 Windows 控件不会为此生成通知 尝试解决此限制会带来痛苦 您只是无法分辨插
  • 一次性返回所有可枚举的yield return;不循环

    我有以下函数来获取卡的验证错误 我的问题涉及处理 GetErrors 两种方法具有相同的返回类型IEnumerable
  • git:小型项目工作

    我目前正在尝试遵循 Pro Git 书中提到的基于小型项目的工作组 http progit org book ch5 2 html http progit org book ch5 2 html 所以 这是我的设置 Live Website
  • EF4 CTP5 自引用分层实体映射

    好吧 这应该很容易 但我一直在抓狂 这是我的 POCO 与机器零件有关 因此零件可以包含在父零件中 public class Part public int ID get set public string Name get set pub
  • 如何更新数组范围变量中的值?

    我有一个存储存档的作用域变量 viewScope MY SCOPE new Array viewScope MY SCOPE push id0 0 true viewScope MY SCOPE push id1 1 false viewS
  • 扩展 std 命名空间被视为未定义行为的原因是什么?

    为什么要添加名字std命名空间未定义的行为 显而易见的答案是 因为标准是这么说的 例如在 C 14 命名空间 std 17 6 4 2 1 1 中 如果 C 程序向命名空间添加声明或定义 则其行为是未定义的std或到一个 命名空间内的命名空