为什么内联未命名命名空间?

2024-01-30

专家快速介绍:C++11 允许声明未命名的命名空间inline。这对我来说似乎是多余的;在未命名命名空间中声明的内容已经被使用,就像它们在封闭命名空间中声明一样。

所以我的问题是:这是什么意思

inline namespace /*anonymous*/ {
    // stuff
}

它与传统的有何不同

namespace /*anonymous*/ {
    // stuff
}

我们从 C++98 中了解并喜爱的是什么?谁能举一个不同行为的例子inline用来?

EDIT:只是为了澄清,因为这个问题已被标记为重复:我不是在问named一般而言,内联命名空间。我了解那里的用例,并且我认为它们很棒。我特别想问声明一个是什么意思unnamed命名空间为inline。由于未命名的命名空间必然始终是 TU 本地的,因此符号版本控制原理似乎不适用,所以我很好奇添加什么inline实际上does.


顺便说一句,关于未命名命名空间的标准 [7.3.1.1] 说:

inline当且仅当它出现在未命名命名空间定义

但这在我的非语言律师眼中似乎是同义反复——“它出现在定义中当且仅当它出现在定义中”!对于奖励积分,任何人都可以解释一下这段标准话实际上在说什么吗?

EDIT:Cubbi 在评论中获得了加分:

标准是这样说的未命名命名空间定义表现得好像它被替换为X where inline出现在X当且仅当它出现在未命名命名空间定义


我不知道回答你自己的问题是否已经完成,但经过一番尝试后我的好奇心得到了满足,所以我不妨分享一下。

内联命名空间的定义不仅包括将名称提升到封闭命名空间(对于未命名命名空间无论如何都会发生这种情况),而且还允许在内联命名空间内定义的模板在其外部进行专门化。事实证明这也适用于未命名的命名空间:

inline // comment this out to change behaviour
namespace { 
    template <typename T> struct A {};
}

template <> struct A<int> {};

如果没有inline,g++ 抱怨尝试从不同的命名空间专门化模板(尽管 Clang 没有)。和inline,它编译得很好。对于这两个编译器,专业化中定义的任何内容仍然被标记为具有内部联系(根据nm),就好像它在未命名的命名空间内一样,但我想这是可以预料的。我真的想不出为什么这会有用,但我们就这样吧。

可以说更有用的效果来自于以下方面的变化参数相关的查找对于内联命名空间,这也会影响未命名的内联命名空间。考虑以下情况:

namespace NS {
    // Pretend this is defined in some header file
    template <typename T>
    void func(const T&) {}

    // Some type definition private to this TU
    inline namespace {
        struct A {};
    }

} // end namespace NS

int main()
{
    NS::A a;
    func(a);
}

Without inline,ADL失败,我们必须显式地写NS::func(a)。当然,如果我们在顶层定义未命名的命名空间(通常会如此),那么无论它是否内联,我们都不会获得 ADL,但仍然......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么内联未命名命名空间? 的相关文章

  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 当模板类不包含可用的成员函数时,如何在编译时验证模板参数?

    我有以下模板struct template
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 文件错误地报告已修改 - git 属性有问题吗?导致回购不一致

    这很容易导致 git 存储库不一致 如果提交的文件以 crlf 行结尾且工作树中未设置文本属性 但在存储库中设置了文本属性 则该文件将错误地显示为已修改 我在 Mac Darwin 13 1 0 上使用 Git 1 8 5 重现此内容cor
  • div 底部的微妙曲线

    我正在努力实现一个微妙的曲线在我的底部 div 这是我想要实现的目标的示例图像 我试图通过这样做来实现它 section box border bottom left radius 40 border bottom right radius
  • 我再也看不到 .SVN 文件夹了?

    我最近将我的乌龟升级到了1 7版本 已经有一段时间了 我看不到 svn 文件夹 我曾经复制文件夹来复制一些代码 进入该文件夹并删除复制版本的 svn 以便它认为该代码是新的 我再也不能做这个了 有人知道发生了什么事吗 Subversion
  • NoClassDefFoundError - 无法初始化类...?

    我在编写简单的测试程序时遇到错误 package Xbee import com rapplogic xbee api XBee import com rapplogic xbee api XBeeException public clas
  • 如何使用 Node.js 加密创建 ECDSA 签名?

    以下示例中 Node 加密模块使用什么签名算法 我无法从文档 https nodejs org api crypto html cryptocreatesignalgorithm options 摘要算法是 SHA 256 但我使用的是 E
  • 如何在Intellij中生成串行版本UID

    当我使用Eclipse它有一个很好的功能来生成串行版本 UID 但是在 IntelliJ 中该怎么办呢 如何在 IntelliJ 中选择或生成相同的串行版本 UID 当修改旧类时该怎么办 如果您没有指定id 它是在运行时生成的 没有任何插件
  • 将 div 的内容底部对齐

    我有一个包含 2 个段落的 div 我希望段落与 div 的右下角对齐 我能够使用对齐段落text align right 但我正在努力尝试让段落与 div 底部对齐 标记非常简单 div p content 1 p p content 2
  • IntelliJ Idea 根据文件结构突出显示;不是文件扩展名

    我有一个小问题 项目中存在几个 conf 文件 但它们有不同的文件结构 其中一个是 XML 例如 Resin conf 另一个是 javaproperties file 有什么方法可以手动更改突出显示 或者甚至更好 自动更改突出显示类型 提
  • 为什么我的 Flink 窗口使用这么多状态?

    我的 Flink 作业的检查点变得越来越大 在深入研究各个任务后 键控窗口函数似乎负责大部分大小 我怎样才能减少这个 如果您在 Windows 中绑定了很多状态 则有几种可能性 使用增量聚合 通过使用reduce or aggregate
  • 将引用传递给引用

    我认为在 C 中传递对引用的引用是非法的 但是 当我运行此代码时 它没有给我错误 void g int y std cout lt lt y y void f int x g x int main int a 34 f a return 0
  • 从另一张 iOS 中减去一张图像

    任何人都知道如何从另一个 UIImage 中减去一个 UIImage 例如这个屏幕 感谢您的回复 我相信您可以通过使用来完成此任务kCGBlendModeDestinationOut混合模式 创建一个新的上下文 绘制背景图像 然后使用此混合
  • 验证 WPF 组合框中选定的值

    就像标题所说 我正在尝试验证我的表单 但在获取组合框值时遇到问题
  • Spark DataFrame 分区器为 None

    Spark新手 创建 DataFrame 后 我尝试根据 DataFrame 中的列对其进行分区 当我使用检查分区器时data frame rdd partitioner I get None作为输出 分区使用 gt data frame
  • 在 MySQL 服务器或 PHP 中更快地随机化许多结果

    在 MySQL 服务器上随机化大量结果的排序顺序更快还是在 PHP 中收到数据后更快 有谁有任何数据可以备份 甚至是轶事经验吗 我有根据的猜测是 MySQL 毫无疑问会获胜 它就是为了以这种方式处理数据而设计的 必须将所有数据移至 PHP
  • C 中字符串中所有可能的组合

    我正在尝试使用 C 打印字符串 abc 的所有可能组合 有人可以帮助指出我在这段代码中哪里出错了吗 我正在使用这里提到的算法 http hackercs com videos Combinations of a String Part 2
  • 如何编写带有子查询作为 WHERE 子句一部分的 Django 查询?

    我正在使用 Django 和 Python 3 7 我无法弄清楚如何编写 Django 查询 其中子查询作为 where 子句的一部分 这是模型 class Article models Model objects ArticleManag
  • JQuery 文档就绪 - 允许多个吗? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery 拥有多个 document ready function 是否不好 https stackoverflow com questions 1148241 jquery is it bad
  • 我如何得到,用户在 facebook sdk 4.0.1 中登录或注销

    我正在使用 Facebook 新的 sdk 4 0 1 因为当我登录按钮更改为注销时 相同的按钮用于注销 无需任何代码 但实际上我想在注销时进行一些编码 那么我如何区分该 SDK 中的这两件事呢 我如何声明注销方法 您可以检查令牌何时更改
  • JavaScript 警报后页面重新加载/刷新 - 不希望这样做!

    我的 JavaScript 函数正在工作 但由于某种原因 在我的 IF 语句中显示警报后 页面重新加载 刷新 但我不希望它这样做 这是为什么 我怎样才能改变我的功能 使它不会这样做 我的功能 function valSubmit varNa
  • 为什么内联未命名命名空间?

    专家快速介绍 C 11 允许声明未命名的命名空间inline 这对我来说似乎是多余的 在未命名命名空间中声明的内容已经被使用 就像它们在封闭命名空间中声明一样 所以我的问题是 这是什么意思 inline namespace anonymou