是否使用了 static constexpr 变量 odr?

2023-12-12

给出下面的代码是Foo::FOO1是否使用 ODR?

#include <iostream>
#include <map>
#include <string>

class Foo
{
public:
    static constexpr auto FOO1 = "foo1";
    void bar();
};

void Foo::bar()
{
    const std::map<std::string, int> m = {
        {FOO1, 1},
    };
    for (auto i : m)
    {
        std::cout << i.first << " " << i.second << std::endl;
    }
}

int main()
{
    Foo f;
    f.bar();
    return 0;
}

编译代码-O1或以上,这是可以的,但如果编译-O0,我收到以下错误(请参阅科利鲁示例:

undefined reference to `Foo::FOO1'

这表明它是 ODR 使用的。是哪一个?


我知道上面的代码用 -O 构建得很好,但是在真实(且更复杂)的案例:

  • 代码可以通过 -O2 正常编译和链接
  • 代码得到上面的内容undefined reference错误链接时间优化(-O2 -flto)

所以这表明这两种优化(-O) 和 LinkTimeOptimization (-flto) 会影响 ODR 使用规则吗? C++14 和 C++17 之间有变化吗?


规则是[基本.def.odr]/4:

一个变量x其名称显示为可能评估的表达式ex is odr-used by ex unless将左值到右值转换应用于x产生一个不调用任何非平凡函数的常量表达式,并且,如果x是一个对象,ex是表达式的潜在结果集合中的一个元素e,其中左值到右值转换 ([conv.lval]) 应用于e, or e是一个废弃值表达式 ([expr.prop])。

第一部分显然是满意的(FOO1 is constexpr因此,左值到右值的转换确实会产生一个常量表达式,而无需调用非平凡函数),但这是第二个吗?

我们正在构建一个map。相关的那里的构造函数需要一个initializer_list<value_type>,也就是说initializer_list<pair<const string, int>>. pair has a 一堆构造函数,但这里要调用的是:

template <class U1, class U2>
constexpr pair(U1&& x, U2&& y); // with U1 = char const*&, U2 = int

这里重要的部分是我们不是直接构建一个string,我们正在经历这个转换构造函数pair,其中涉及绑定对的引用FOO1。这是一种 ODR 使用。这里没有左值到右值的转换,也不是丢弃值表达式。

基本上,当你获取某个东西的地址时,这就是 odr-use - 它必须有一个定义。所以你必须添加一个定义:

constexpr char const* Foo::FOO1;

另一方面,请注意:

std::string s = FOO1;

would not成为网上解决用途。这里我们直接调用一个构造函数char const*参数,这将是左值到右值的转换。


在 C++17 中,我们得到了这个新句子[dcl.constexpr]:

使用 constexpr 说明符声明的函数或静态数据成员隐式是内联函数或变量 ([dcl.inline])。

这不会改变 odr-use 的任何内容,FOO1仍然在您的程序中使用 odr。但它确实使FOO1隐式地是一个内联变量,因此您不必显式地为其添加定义。很酷。


另请注意,程序编译和链接并不意味着缺少定义的变量未被 odr 使用。

那么这表明优化 (-O) 和 LinkTimeOptimization (-flto) 都会影响 ODR 使用规则吗?

他们不。优化就是这么酷。

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

是否使用了 static constexpr 变量 odr? 的相关文章

  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 带有 GoDaddy 证书的 HTTP SSL - 此服务器的证书链不完整

    一般来说 我从 GoDaddy 获得了 3 个文件 主证书文件 服务器私钥 捆绑文件 通过以下方式在我的 Go 服务器中配置了所有这些文件 cert err tls LoadX509KeyPair myalcoholist pem myal
  • 访问 Struts 2 中的所有用户会话

    我正在使用 JPA 构建 struts 2 应用程序 用户可以多次登录该应用程序 我想 用户能够在网格中查看他的所有会话 并可能突出显示当前会话 并且用户可以选择一个会话并终止它 管理员还应该能够查看所有登录的用户 还可以查看每个登录用户的
  • 如何更改元素的内部文本而不更改其子元素

    我有一个 html 元素 例如 div Change only me div but not me div div 但我只想更改第一个文本并保留子 div 不变 document getElementById el1 innerText c
  • Jquery 自动完成 utf-8 字符区分大小写

    我正在使用 jquery 自动完成插件来搜索一长串名称 它适用于所有拉丁语和英语字符 但对于土耳其语字符我遇到问题 因为搜索将区分大小写 例如 A and a将匹配包含以下内容的所有城市A or a and i不会匹配像这样的城市 stam
  • Flexbox 内的图像高度在 Chrome 中不起作用

    我有一个div using flexbox将其项目居中 里面这个div我有 3 个元素 其中之一是图像 div div div img src alt div div div container1 and container2有自己的身高
  • 尝试遮盖图像周围的圆圈不起作用

    我有一个图像 我试图在周围遮盖一个圆圈 使图像看起来是圆形的 这有点有效 但圆圈在顶部和底部达到一个点 profileImageView layer cornerRadius profileImageView frame size widt
  • Scala 案例类继承

    我有一个基于 Squeryl 的应用程序 我将模型定义为案例类 主要是因为我发现复制方法很方便 我有两个严格相关的模型 字段是相同的 很多操作是共同的 并且要存储在同一个DB表中 But有些行为仅在两种情况之一中有意义 或者在两种情况下都有
  • 使用 mlflow 提供用于评分的自定义 Python 模型

    我使用带有 mlflow 的 ML 软件生成的 Python 代码来读取数据帧 执行一些表操作并输出数据帧 我能够成功运行代码并将新数据帧保存为工件 但是 我无法使用 log model 记录模型 因为它不是我们训练和拟合的 LR 或分类器
  • 使用WindowManager添加View,但可以按回键

    我使用 WindowManager 添加了一个视图 它正确地显示了我想做的事情 但我有一个问题 这就是问题 返回键按下不会影响 Android 组件 如 Activity 我想要的是我添加的视图可以聚焦 可以单击视图的内部按钮 仅当单击视图
  • 有没有办法在批处理文件中拥有多种字体、文本大小等?

    正如标题所说 我不知道是否有任何可能的方法来做这样的事情 批处理文件中的粗体 斜体 字体 文本大小 以及是否可以在同一文件中使用它们的不同值 这可能是不可能的 但如果是的话 有人可以告诉我怎么做吗 注意 我不想讨论属性或其他什么 我的意思是
  • 创建初始数据库时访问被拒绝 - 如何授予正确的访问权限?

    我正在heroku上使用mysql创建一个新项目 他们有一个名为JawsDB的插件 它为我提供了mysql主机 用户名 密码 更新 我也尝试过使用他们的其他 mysql 插件 ClearDB 并且我有完全相同的问题 我可以像这样连接到数据库
  • 无法为 python 安装 pandas

    我正在尝试为 python 安装 pandas 但我不断收到很长的错误消息 所以我尝试了以下方法 卸载并重新安装 python 版本 3 10 0 通过命令提示符导航到目录来安装 pandas C Users 用户名 AppData Loc
  • 将特定字符串值映射到 matplotlib.pyplot.imshow() 中的特定颜色

    我有一个pandas dataframe看起来像这样 columns 0 1 2 3 4 5 A A A A B B B B B C C D D D E E F F 我想用它来绘制pyplot imshow 指定以下颜色图 color di
  • 如何从 datagridview 创建主详细信息

    这段代码插入数据库 private void btnSave Click object sender EventArgs e byte imageBt null FileStream fstream new FileStream this
  • SQLite 条件插入或替换

    我正在尝试将记录插入或更新到 sqlite 数据库中 并且仅在新值大于旧值时才更新该值 架构是 CREATE table IF NOT EXISTS SearchTable Owner INTEGER PRIMARY KEY Generat
  • 使用 jQuery 进行简单的屏幕抓取

    我一直在考虑使用 jQuery 使用简单的屏幕抓取器的想法 我想知道以下是否可行 我有简单的 HTML 页面 并且正在尝试 如果可能的话 从另一个页面获取所有列表项的内容 如下所示 主页
  • 计算字符串的所有可能的组合,并进行扭曲

    我试图允许用户在文本框中输入文本 并让程序生成所有可能的组合 但最少 3 个字符和最多 6 个字符除外 我不需要像 as 这样无用的单词 a i to 等弄乱了我的数组 我还将根据字典检查每个组合 以确保它是一个真实的单词 我已经完成了字典
  • 计算csv文件中python中的特定出现次数

    我有一个包含 4 列的 csv 文件 标签 用户 质量 Cluster id 使用 python 我想执行以下操作 对于每个 cluster id 从 1 到 500 我想查看每个用户的好标签和坏标签的数量 从质量列获得 有超过6000名用
  • Android studio getSlotFromBufferLocked:未知缓冲区错误

    我想制作一个简单的登录和注册应用程序 以便用户可以创建一个帐户 姓名 用户名 密码 我使用 WAMP 和 MYSQL 数据库来存储帐户 当我在注册表单上填写用户信息并单击 注册 时 出现以下错误 09 14 09 30 39 864 262
  • 是否使用了 static constexpr 变量 odr?

    给出下面的代码是Foo FOO1是否使用 ODR include