类中 static const ODR

2023-11-22

我有点困惑statica 的类内初始化const成员。例如,在下面的代码中:

#include <iostream>

struct Foo
{
    const static int n = 42;
};

// const int Foo::n; // No ODR

void f(const int& param)
{
    std::cout << param << std::endl;
}

int g(const int& param)
{
    return param;
}

template<int N>
void h()
{
    std::cout << N << std::endl;
}

int main()
{
    // f(Foo::n); // linker error, both g++/clang++
    std::cout << g(Foo::n) << std::endl; // OK in g++ only with -O(1,2 or 3) flag, why?!
    h<Foo::n>(); // this should be fine
}

Live example

我不定义Foo::n(该行已注释)。所以,我期待着电话f(Foo::n)在链接时失败,确实如此。但是,下面的行std::cout << g(Foo::n) << std::endl;每当我使用优化标志(如-O1/2/3.

  1. 为什么gcc(尝试过gcc5.2.0和gcc 4.9.3)可以编译and link优化开启时的代码?
  2. 我这样说对吗?类内静态常量成员的唯一用途是在常量表达式中,例如模板参数h<Foo::n>调用,在这种情况下代码应该链接?

我认为编译器在优化期间执行以下操作:

  • 价值const static int n到处都是内联的。没有为变量分配内存n,对它的引用变得无效。功能f()需要参考n所以程序没有被编译。

  • 功能g简短而简单。它被有效地内联和优化。优化后的功能g不需要参考n,它只返回常量值 42。

解决方案是在类外部定义变量:

struct Foo
{
    const static int n;
};

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

类中 static const ODR 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

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

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

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

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 重复字符在 PowerShell 中不起作用

    我想在 PowerShell 中重复一个字符 例如 test this is a test that I want to underline with Write Host test Write Host test length 然而 上述
  • npm 以一种奇怪的递归方式安装依赖项

    I used npm install dev安装a中列出的依赖项package json文件 似乎不是以平面结构安装所有包 而是在模块目录中安装每个模块的依赖项 我不得不取消它 因为它花了很多时间 因为许多依赖项应该已经得到满足 但它必须在
  • 使用 Mockito 进行 Retrofit 2 api 调用的单元测试

    我需要一些关于如何模拟 Rest api 的建议 我的应用程序采用 MVP 架构 我的API接口 public interface MyAPI GET cmd userName password Observable
  • python 中浮点数末尾的后缀 e+number 是什么意思? [复制]

    这个问题在这里已经有答案了 I use random uniform 1 2 100 产生范围内的随机浮点数 0 2 100 一些结果是 gt gt gt random uniform 1 2 100 5 9798650563331964e
  • 原则 2 中的代理人是什么?

    我刚刚读完所有 Doctrine 2 文档 我开始了自己的沙箱 我理解了大部分原理 但仍然有一个问题 我在文档中找不到任何完整的解释 什么是Proxy课程 我什么时候应该在实体上使用它们 据我了解 代理类添加了一个层 让您可以向实体添加一些
  • 当字符串包含html实体时,在Javascript中设置文本节点的nodeValue

    当我设置文本节点的值时 node nodeValue string with xxxx sort of characters 符号被转义 是否有捷径可寻 您需要对 Unicode 字符使用 Javascript 转义 node nodeVa
  • 为什么没有调用 AccountAuthenticator#getAuthToken() ?

    我通过扩展创建了自己的 Android 帐户身份验证器AbstractAccountAuthenticator并实施addAccount and getAuthToken 其中的一些方法被调用AccountManager 但其他人则不然 这
  • 从头开始构建 Eclipse IDE - 制作更大的图标有时会成功

    Even the newest Eclipse Neon edition has still somewhat small icons on a 4k display That is why I m trying to make them
  • 如何在 ASP.NET 中全局设置日期格式?

    如何在 ASP NET 中全局设置日期格式 我的本地计算机和服务器的区域设置设置为 英语 新西兰 当我格式化日期时dd MM yyyy我期待看到19 11 2008以今天为例 直到最近 这实际上是我从本地计算机和服务器上获得的 就在最近 由
  • 如何使用 Spring Security hasRole 常量

    我有一个带有 Spring Security 的 JSP 我有一个简单的标签来确定用户是否有ADMIN像这样的角色
  • PyBrain:如何在神经网络中放置特定的权重?

    我试图根据给定的事实重新创建一个神经网络 它有 3 个输入 一个隐藏层和一个输出 我的问题是权重也给定了 所以我不需要训练 我在想也许我可以保存类似结构神经网络的训练并相应地改变值 你认为这会起作用吗 还有其他想法吗 谢谢 神经网络代码 n
  • Android 耳机插孔监听器

    有谁知道如何在 Android 上检测设备上的耳机插孔是否已拔出 我有一个音乐播放器 当拔掉耳机时我需要暂停音乐 我发现的最接近的东西是使用AudioManager 这是正确的方向吗 这就是我最终所做的 private class Nois
  • 强制粘贴事件以 Base64 编码图像

    背景 我正在为我的公司开发一个 HTML5 Web 应用程序 它基本上是一个将信息存储在数据库中的富文本编辑器 类似于 Google 文档 我们使用 CKEditor 3 作为富文本编辑器和 Jquery 来完成此任务 我们选择 Googl
  • Thymeleaf:可点击的行

    我想在 html thymeleaf 中生成可点击的表格行 但我有以下问题 AFAIK 它无法用链接 a 标签 包装 tr 元素 因为表只能 直接包含 tr 子标签 所以我必须包装每个 td tag 的内容 但这些值是由 thymeleaf
  • 单击 Windows 窗体中 CefSharp 浏览器中的按钮

    我正在尝试单击网页 kahoot it 上的按钮 并且我已经知道我可能需要使用 Javascript 来实现这一点 只要它保留 1 行 JavaScript 因为这很容易在WinForms 我没有太多关于按钮的信息 仅有的
  • 使用 htaccess 阻止特定目录的所有机器人/爬虫/蜘蛛

    我正在尝试阻止特殊目录的所有机器人 爬虫 蜘蛛 我怎样才能做到这一点htaccess 我搜索了一下 找到了基于用户代理阻塞的解决方案 RewriteCond HTTP USER AGENT googlebot 现在我需要更多的用户代理 对于
  • 从 Rails 表单获取数组

    我需要设计一个表格account资源 在这种形式下 我需要收集一些 id 集作为数组params属性中的哈希值称为relationships 所以最后的params account POST 请求的哈希值应类似于 name gt somen
  • 嵌套垂直边距折叠如何工作?

    我很难理解嵌套元素中垂直边距折叠的概念 我来了一篇文章http www howtocreate co uk tutorials css margincollapsing解释它是如何工作的 但是我对其解释感到困惑 所以在它的例子中它引用了以下
  • Rails:使用多个条件连接

    我有一个简单的模型 例如 class Interest lt ActiveRecord Base has and belongs to many user profiles end class UserProfile lt ActiveRe
  • 类中 static const ODR

    我有点困惑statica 的类内初始化const成员 例如 在下面的代码中 include