Global const string& 对我来说很难闻,它真的安全吗?

2023-11-21

我正在审查一位同事的代码,我发现他在全局范围内定义了几个常量,如下所示:

const string& SomeConstant = "This is some constant text";

就我个人而言,这对我来说很糟糕,因为该引用指的是我假设是从给定 char 数组构造的“匿名”对象。

从语法上讲,它是合法的(至少在 VC++ 7 中),并且似乎可以运行,但实际上我宁愿让他删除 &,这样它在做什么就没有歧义了。

那么,这真的安全合法而且我很着迷吗?正在构造的临时对象是否有保证的生命周期?我一直假设以这种方式使用的匿名对象在使用后会被破坏......


所以我的问题也可以推广到匿名对象的生命周期。标准是否规定了匿名对象的生命周期?它与同一范围内的任何其他对象具有相同的生命周期吗?或者只给出表达式的生命周期?


此外,当作为本地人执行此操作时,其范围显然有所不同:

class A
{
    string _str;

public:
    A(const string& str) :
        _str(str)
    {
        cout << "Constructing A(" << _str << ")" << endl;
    }

    ~A()
    {
        cout << "Destructing A(" << _str << ")" << endl;
    }
};

void TestFun()
{
    A("Outer");
    cout << "Hi" << endl;
}

Shows:

构造A(外); 破坏A(外层); 你好


这是完全合法的。直到程序结束它才会被破坏。

EDIT: Yes,保证:

“所有没有动态的对象 存储时间,无线程 存储持续时间,并且不是本地的 具有静态存储时间。这 这些对象的存储应持续 在计划期间 (3.6.2、3.6.3)。”

-- 2008 年工作草案,编程语言 C++ 标准,第 3.7.1 页。 63

正如马丁指出的,这并不是全部答案。标准草案进一步指出(§ 12.2,第 250-1 页):

“创建了类类型的临时对象 在各种上下文中:绑定右值 参考文献 (8.5.3) [...] 即使 临时对象的创建 被避免(12.8),所有语义 应尊重限制,如同 临时对象已创建。 [...] 临时对象被销毁 作为评估的最后一步 完整表达式 (1.9) that(词汇上) 包含他们所在的点 创建的。 [...]有两种情况 其中临时对象被销毁于 与结尾不同的点 充分表达。 [...] 第二 上下文是当引用被绑定时 到一个临时的。临时到哪个 参考已绑定或 临时的即完整的对象 引用的子对象的 是绑定持续存在的一生 除非另有说明,否则参考 以下。”

我在 g++ 中测试过这是否会让你感觉好一些。 ;)

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

Global const string& 对我来说很难闻,它真的安全吗? 的相关文章

随机推荐

  • 上传Excel并将其存储在数据库中?

    我想将Excel文件上传到我们的网页中 然后将相应的数据存储在数据库中 然后我想检索所有数据并以表格格式显示 我有一个代码 但使用该代码无法上传所有 Excel 文件 只能上传单一格式 下面是该函数 但有一些限制 public functi
  • 错误:无法删除该对象,因为在 ObjectStateManager 中未找到该对象

    试图在这里掌握实体框架 但我遇到了一些障碍 我有一个 Get 方法 工作正常并且已经过测试 但我的 Delete 方法不起作用 public static void Delete string name J1Entities db new
  • 如何将宽度设置为“填充父项”的 Android 按钮中的图标和文本居中

    我想要一个 Android 按钮 其中图标 文本居中 我使用 drawableLeft 属性来设置图像 如果按钮的宽度为 wrap content 但我需要拉伸到最大宽度 所以我使用宽度 fill parent 这会将我的图标直接移动到按钮
  • IntelliJ 无法从本地 Maven 存储库加载源

    我正在做一些测试工作 需要使用 JUnit 中我不熟悉的功能 为了更好地理解这些功能 我希望能够在我的项目旁边查看 IntelliJ 内的 JUnit 源代码 本项目使用Maven 我的 pom xml 文件中列出了 jUnit 的以下依赖
  • 在 find + xargs grep 中得到退出代码 123

    这是我的脚本 eval find type f a name h print0 xargs 0 n100 grep f lt echo stdio echo 未找到任何内容 退出代码为 123 如果我稍微修改一下如下 echo stdio
  • 如何获得连续第二高的值?

    我想从数据帧中获取每一行的某个部分的第二高值 我该怎么做呢 我已经尝试过以下代码 但它不起作用 df iloc 5 3 nlargest 2 axis 1 level 2 还有其他方法可以获得这个吗 使用 apply 和 axis 1 您可
  • 读回 sqlite3 中的日期时间

    我正在使用 Python 创建一个带有时间戳列的内存 sqlite3 数据库 当我在查询中对此列使用 min 或 max 时 该列将作为字符串而不是 Python 日期时间对象返回 我读了一篇Stackoverflow 上的上一个问题它为普
  • “eval”和“int”有什么区别

    早些时候我听说eval input a 会自动将字符串转换为 int 但是如果我编码 age eval input enter age 在输入期间我输入 01 这是一个错误 但是当我编码时 age int input enter age 0
  • TFS 2010 新功能 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 有谁知道我可以去哪里获取 TFS 2010 新功能的列
  • 为分组表视图中的每个部分添加阴影

    如图所示 我想向表视图部分添加阴影 就像表视图有 4 个部分一样 表视图中也会有 4 个阴影视图 func numberOfSections in tableView UITableView gt Int 返回 3 func tableVi
  • Backbone.save POST 而不是 PUT

    只是一个简短的问题 拥有模型的新实例并发出model save URL 设置为 api store category Backbone 发出 POST 据我所知 它应该使用 PUT 就像本中提到的那样 PUT 或 POST 故事的其余部分
  • linux/module.h 没有这样的文件或目录

    在我的论文中 我将使用 ARAN 协议创建一个马奈 安装我正在使用的协议本手册 但是第一步 创建trace route 我收到了错误 例如 linux module h No such file or directory linux pro
  • C# 中的finally 块是必须的吗?

    2个条件有什么区别 每次method1和method2运行时 都应该有一个代码块需要运行 在我看来 两种方法是相同的 example method1 void Method1 void try do something catch Exce
  • OnItemLongClickListener 无法在自定义列表视图中工作

    我希望在长时间单击自定义列表视图中的项目后显示上下文菜单 我正在使用动作栏夏洛克 尝试使用 Toast 通知进行调试 我发现长按事件未触发 如何解决这个问题 m vwJokeLayout ListView findViewById R id
  • 是否可以通过 Julia 中的覆盖函数来调用重载函数?

    问题如下 我有一个抽象类型MyAbstract和派生的复合类型MyType1 and MyType2 abstract type MyAbstract end struct MyType1 lt MyAbstract somestuff e
  • 动画剪辑:矩形属性?

    我想为 css 属性设置动画clip rect与 jQuery 的 animate 但无法找到这是否可能在任何地方 试过 img1 animate clip rect 1px 945px 499px 1px 300 没有任何运气 有人知道吗
  • 在 C 中转换为 ASCII

    使用微控制器 PIC18F4580 我需要收集数据并将其发送到 SD 卡以供以后分析 它收集的数据的值介于 0 到 1023 或 0x0 到 0x3FF 之间 所以我需要做的是将 1023 转换为以 10 为基数的 ASCII 值字符串 0
  • 使用 AutoIt 发送电子邮件

    如何使用 AutoIt 发送电子邮件 只需要一个干净的示例和解释 其中包含 to from subject message 使用内置代码有两种主要方法 INetMail 或 INetSmtpMail 以下是帮助文件中的简单代码示例 如果您对
  • 从 iOS 应用程序上传文件到 ftp

    我读了SimpleFTP示例但我需要一个比这个文档更好的例子 我在 Google 上搜索了一些其他示例 但我发现的所有网站最终都引用了 Apple 文档 而且我还没有找到任何其他没有引用的内容 有人能帮我吗 谢谢 为 iOS 编写了一个易于
  • Global const string& 对我来说很难闻,它真的安全吗?

    我正在审查一位同事的代码 我发现他在全局范围内定义了几个常量 如下所示 const string SomeConstant This is some constant text 就我个人而言 这对我来说很糟糕 因为该引用指的是我假设是从给定