模板静态成员初始化顺序

2023-12-03

我有一个与此处发布的上一个问题相关的问题静态字段初始化顺序假设我有以下结构,有 2 个静态成员x and y(模板类型本身)

#include <iostream>

using namespace std;

template <typename T>
struct Foo
{
    static T x;
    static T y;
    Foo()
    { 
         cout << "x = " << x << endl;
         cout << "y = " << y << endl;
    }
};

template <typename T>
T Foo<T>::x = 1.1f;

template <typename T>
T Foo<T>::y = 2.0 * Foo<T>::x;


int main()
{
    Foo<double> foo;
}

Output:

x = 1.1 
y = 2.2

我初始化x and y above main(),你可以看到y依赖于取决于x,所以最好是这样x首先被初始化。

我的问题:

  1. 在初始化时,类型x and y仍然未知,那么它们什么时候真正初始化呢?静态成员是否在模板实例化后实际初始化Foo<double> foo; in main()?
  2. 如果是,则声明的顺序x and y似乎并不重要,即我可以先声明y then x(在结构体和静态初始化中)并且仍然得到正确的输出,即编译器以某种方式知道y取决于x。这是一个明确定义的行为(即符合标准)吗?我在 OS X 上使用 g++ 4.8 和 clang++。

Thanks!


这段代码是安全的,因为Foo<double>::x具有恒定的初始化,但是Foo<double>::y具有动态初始化。

3.6.2/2:

常量初始化执行:

  • ...

  • 如果具有静态或线程存储持续时间的对象未由构造函数调用初始化,并且其初始值设定项中出现的每个完整表达式都是常量表达式。

零初始化和常量初始化一起称为静态初始化;所有其他初始化是动态初始化。静态初始化应在任何动态初始化发生之前执行。

另一方面,如果您有:

double tmp = 1.1;

template <typename T>
T Foo<T>::x = tmp;

template <typename T>
T Foo<T>::y = 2.0 * Foo<T>::x;

该代码不会“安全” -Foo<double>::y最终可能是2.2 or 0.0(假设没有其他改变tmp在动态初始化期间)。

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

模板静态成员初始化顺序 的相关文章

随机推荐

  • 如何确定RNN中神经元的数量?

    我是 RNN 新手 并试图理解它们 由于它需要输入序列 那么神经元的数量应该与序列的大小相同 对吧 那么 如果我们有 10 个时间步长 因此有 10 个不同的输入 那么我们应该有 10 个神经元 对吗 另外 神经元的数量会随着时间的增加而增
  • 如何在 python 中将图像块传输到特定图像的区域内?

    我正在制作一个游戏 我需要将我的对象复制到特定图像的区域内 我不想需要我的表面来传输这些图像 是否可以 我使用的是pygame 如果您能更好地解释您正在尝试做什么 那么将来会更好 因为它会给您更多答案 根据我的理解 你想将一个图像传输到另一
  • 将通过HTTP上传到ASP.NET的文件进一步上传到C#中的FTP服务器

    上传表格
  • jquery ajax 切断 IE 中的响应

    我正在使用jquery 表单插件它使用 jquery ajax 来完成大部分工作 我们有jquery 1 7 2 我们使用它通过 ajax 向服务器发送表单 并返回指示成功的值或返回带有验证错误的表单 我让它在 Firefox 和 Chro
  • Java BigDecimal 三角方法

    我正在开发一个数学解析器 它能够像这样评估字符串 5 b sqrt c 2 我正在使用 ANTLR 进行解析并取得了良好的进展 现在我迷上了Java课程BigDecimal并想 嘿 为什么不考虑这里的精度呢 我的问题是 Java API 没
  • 在 Django 中,如何检查用户是否属于某个组?

    我在 Django 的管理站点中创建了一个自定义组 在我的代码中 我想检查用户是否属于该组 我怎么做 Your User对象链接到Group对象通过一个多对多关系 您可以因此应用filter方法用户组 因此 要检查给定用户是否属于某个组 例
  • 检查迭代器是否有效

    有没有什么方法可以检查迭代器 无论是来自向量 列表 双端队列 是否 仍然 可取消引用 即尚未失效 我一直在使用try catch 但是有没有更直接的方法来做到这一点 示例 这不起作用 list
  • C# 定时器和内存泄漏

    我正在创建一个程序 每 2 秒检查一次目录列表 我希望这个程序能够运行数月而不会泄漏内存或需要任何人机交互 下面的程序有内存泄漏 我仍然不确定10K代表什么 这不是间隔 间隔为2k class Program static void Mai
  • ClearCase 中是否有 RTC 等效的“挂起模式”?

    我发现 RTC 中的 暂停更改设置 非常有用 而且由于我们也在使用 ClearCase 数十个用户 我想知道 ClearCase 中是否也提供该功能 如果不是 它可以由 script trigger hook 生成吗 我们使用UCM 我想解
  • 无法在 igraph 上绘制网络

    我的二进制图基于边缘列表 每个顶点都是股 票市场上的一个股票行情 例如 BARC Barclay s net full phase1 graph edgelist full phase1 directed FALSE V net full
  • 检查是否支持 UIGraphicsBeginImageContextWithOptions

    我正在开发一个 iOS 应用程序 它目前仅适用于 iOS 4 因为我多次使用以下方法 UIGraphicsBeginImageContextWithOptions 此方法仅在 iOS 4 中可用 因此我的应用程序当前崩溃 无法在 iPhon
  • Symfony 3 Twig\Extension\AbstractExtension 在生产模式下未找到错误

    我有一个在开发模式下运行良好的应用程序 但是当我在生产中运行它时会弹出 Fatal error Class Twig Extension AbstractExtension not found in C Users wackm Phpsto
  • 从 Spring 4.xxx 迁移到 Spring 5,保留 EJB 和 Web 模块

    Hi All 服务器 Websphere 9 应用程序在 Spring 4 上运行良好 我们希望迁移到 Spring 5 我们遇到了 DI 依赖注入 的问题 Spring 4 中有 EJB 模块 带有消息驱动 Bean 和 Web 模块 我
  • 清理嵌套的 mod_rewrite 语句

    我正在清理一个大 htaccess文件包含很多mod rewrite声明 混乱的最大部分来自捕获各种事件的语句 directory1 directory1 directory2 directory1 directory2 directory
  • 如何使 Laravel 雄辩地进行“IN”查询?

    我想在 Laravel Eloquent 中进行查询 就像这里的原始 MySQL 查询一样 SELECT from exampleTbl where id in 1 2 3 4 我已经在 Laravel Eloquent 中尝试过这个 但它
  • 将java对象序列化为文本文件

    我有一个java库 我想将java对象的实例保存到文本文件中 我尝试使用所有java库进行序列化和反序列化为xml http karussell wordpress com 2009 09 03 xml serializers for ja
  • 在Python中从文本文件读取多个变量的聪明方法

    我正在尝试加载存储在单个文本文件中的多个向量和矩阵 对于 numpy 该文件如下所示 VectorA 1 2 3 4 MatrixA 1 2 3 4 5 6 VectorB 3 4 5 6 7 理想的解决方案是拥有一个字典对象 例如 Vec
  • py2exe 因 pandas 导入失败

    我有一个 python 脚本 我想使用 py2exe 将其制作成可执行文件 当我尝试导入 pandas 时它失败了 这实际上是我的示例失败脚本中的全部内容 import pandas 回溯看起来像 File c users appdata
  • javascript 在数组中的对象之间保留某些属性

    我想从数组中的对象中删除每个属性 除了其中一些属性 var listToKeep name school var arrayOfObjects id abc name oh school a sport a id efg name em s
  • 模板静态成员初始化顺序

    我有一个与此处发布的上一个问题相关的问题静态字段初始化顺序假设我有以下结构 有 2 个静态成员x and y 模板类型本身 include