- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
阅读 slides about constexpr 时介绍是关于“令人惊讶的 consts 动态初始化”。例子是
struct S {
static const int c;
};
const int d = 10 * S::c;
const int S::c = 5;
唉,音轨不见了,笔记也不见了,所以我只能猜测这里的意思。
d
对吗?被“令人惊讶地”动态初始化,因为 S::c
定义在之前 d
? S::c
的声明在 d
之前可能还不够,编译器需要完整的定义,对吧?
也就是说,我怀疑在以下示例中 d
会静态初始化吗?
struct S {
static const int c;
};
const int S::c = 5;
const int d = 10 * S::c; // now _after_ defn of S::c
为了获得蛋糕,在 C++11 中,必须是 constexpr
用于完全静态初始化? S::c
, d
还是两者都有?
最佳答案
在第一个例子中,d
没有被一个常量表达式初始化,因为 S::c
不是
a non-volatile const object with a preceding initialization, initialized with a constant expression
(参见 C++11 [expr.const]p2,关于左值到右值转换的项目符号),因为 S::c
的初始化不会先于 的初始化d
。因此 S::c
会使用静态初始化(因为它是由常量表达式初始化的),而 d
可以使用动态初始化。
由于静态初始化在动态初始化之前,d
将被其动态初始化程序初始化为 50
。允许编译器将 d
的动态初始化转换为静态初始化,但如果这样做,它必须生成 d
的值,如果每个变量可以具有使用了动态初始化,事实上,使用了动态初始化。在这种情况下,无论哪种方式,d
都会被初始化为 50
。有关这方面的更多信息,请参阅 C++11 [basic.start.init]p2。
没有办法在第一个例子中添加constexpr
来保证d
使用静态初始化;为此,您必须重新排序初始化。但是,添加 constexpr
将为第一个示例生成诊断信息,这至少可以让您确保不使用动态初始化(您得到静态初始化或编译错误)。
您可以更新第二种情况以确保使用静态初始化如下:
struct S {
static const int c; // do not use constexpr here
};
constexpr int S::c = 5;
constexpr int d = 10 * S::c;
在不是定义的变量声明上使用 constexpr
或在不包含初始化程序的变量声明上使用它是不正确的,所以 const
code>,而不是 constexpr
必须在 struct S
的定义中使用。此规则有一个异常(exception),即在定义文字、非整数类型的 static constexpr
数据成员时,使用类中指定的初始化程序:
struct T { int n; };
struct U {
static constexpr T t = { 4 };
};
constexpr T U::t;
在这种情况下,必须在类的定义中使用 constexpr
,以允许提供初始化程序,并且必须在定义中使用 constexpr
静态数据成员,以便允许在常量表达式中使用它。
关于c++ - "surprising"常量初始化因为定义顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625952/
阅读 slides about constexpr 时介绍是关于“令人惊讶的 consts 动态初始化”。例子是 struct S { static const int c; }; const
我试图理解 rdpmc 指令。因此,我有以下 asm 代码: segment .text global _start _start: xor eax, eax mov ebx, 10
我正在使用 Python 模块 telnetlib 创建一个 telnet session (与国际象棋服务器),我遇到了一个我真的无法解决的问题。以下代码完美运行: >>> f = login("m
我看到其他线程说 java 反射性能比使用非反射调用时慢 10-100 倍。 我在 1.6 中的测试表明情况并非如此,但我发现了一些其他有趣的事情,我需要有人向我解释。 我有实现我的接口(interf
// Python 的“整数除法”运算符今天让我感到惊讶: >>> math.floor(11/1.1) 10.0 >>> 11//1.1 9.0 documentation读作“x 和 y 的(取整
我已经在 Windows10 中安装了 scikit-surprise。 C:\Users\Cosmos Lord>pip install scikit-surprise Requirement al
我在安装惊喜包时使用以下命令。我在安装时收到错误消息,我无法理解。我需要帮助才能成功安装此软件包。 pip 安装 scikit-surprise 最后一个错误代码表示需要 Microsoft Visu
我想使用 Surprise 构建一个简单的书籍推荐器图书馆和购买/不购买作为评级值(而不是经典的 1 到 5)。 我的问题是我想在我的 whole dataset 上训练所以我可以得到对 ALL us
我无法理解 Surprise 的工作流程。我有一个用于训练的文件(我试图将其分为训练和验证)和一个用于测试数据的文件。我无法理解 Surprise Dataset 和 Trainset 之间的区别 #
我正在尝试移动一个 body : if (ks.IsKeyDown(Keys.Up)) { rocket.ApplyImpulse(new Box2DX.Common.Vec2(0, 30f)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已经尝试使用以下命令安装SCRIPKIT-SECHING。但是当在我的jupyter笔记本上运行导入时,。我得到以下错误。我目前在Windows 10上使用的是Python 3.11.4,并多次尝试
考虑以下两个 Python 代码示例,它们实现相同但具有显着且令人惊讶的性能差异。 import psycopg2, time conn = psycopg2.connect("dbname=myda
您好,我安装了 surprise 包,它在 import 时出错(第 3 节中的 errr msg) 在 conda cmd 中,我安装了 surprise,后来又重新安装了 scipy,因为它在错误
我正在学习协作学习算法和sklearnsurprise库,但我很好奇.predict函数中这个参数有什么用。 文档指出: We can now predict ratings by directly
我正在学习协作学习算法和sklearnsurprise库,但我很好奇.predict函数中这个参数有什么用。 文档指出: We can now predict ratings by directly
在我的代码中,我做了如下操作: 查询类(class)实体 用给定的类(class)数据填充它。 courseDao.update(entity) 内部调用 persist(entity) 方法。 令人
from surprise import Reader, Dataset, SVD from surprise import evaluate ----------------------------
场景 要导入的数据集包含大量 NaN 值。同样,我在 Python 中使用 SurPRISE 包(由 Nicholas Hug 编写),而不是使用 Pandas。原因是预测 NaN 值的方法与提到的包
我引用最近的Google JavaScript Style Guide : Do not use JavaScript getter and setter properties. They are p
我是一名优秀的程序员,十分优秀!