【发布时间】:2019-10-07 20:43:12
【问题描述】:
我想知道当在两个不同的翻译单元中具有静态存储持续时间的两个常量非局部浮点变量之间存在依赖关系时,我是否可以依赖常量初始化 - 其中一个依赖于(初始化为 [the value of] ) 另一个,对于后者,执行常量初始化。我正在寻找提供和解释标准相关部分的答案,尤其是 C++11 标准。
// Note: the non-use of constexpr is intended (C++03 compatibility)
// foo.h
struct Foo {
static const float kValue;
};
// foo.cpp
const float Foo::kValue = 1.5F;
// bar.h
struct Bar {
static const float kValue;
};
// bar.cpp
#include "foo.h"
const float Bar::kValue = Foo::kValue; // Constant initialization?
// main.cpp
#include "bar.h"
#include <iostream>
int main() { std::cout << Bar::kValue; }
- 具有静态存储持续时间的非局部(常量)变量
Bar::kValue是否通过常量初始化进行初始化? (依次回答是通过静态初始化还是动态初始化)
我自己的细节/调查
[basic.start.init]/1 声明 [emphasis 我的]:
执行不断的初始化:
如果每个完整表达式(包括隐式转换) 出现在带有静态或线程的引用的初始化程序中 存储持续时间是一个常数表达式(5.19),参考是 绑定到指定具有静态存储持续时间的对象的左值 或临时(见 12.2);
如果初始化了具有静态或线程存储持续时间的对象 通过构造函数调用,并且如果初始化完整表达式是 对象的常量初始化器;
如果具有静态或线程存储持续时间的对象不是 由构造函数调用初始化,如果任一对象是 值初始化或出现在其 初始化器是一个常量表达式。
如果Foo::kValue 是一个常量表达式,则从最后的项目符号中解释Bar::kValue 是通过常量初始化来初始化的。我怀疑我可以在 [expr.const] 中找到这是否正确的答案,但在这里我被卡住了。
【问题讨论】:
-
不,
Foo::kValue不是常量表达式,因为编译器在另一个 TU 中看不到它的初始化器,也因为它既不是整数、枚举、constexpr 也不是临时的:timsong-cpp.github.io/cppwp/n3337/expr.const#2.9 -
@Oktalist :
Foo::kValue被声明为 const,那么它就是一个常量表达式。从哪里获取价值是另一个问题 -
@P.PICARD 不,const 和常量表达式是两个不同的东西。
-
@Oktalist 谢谢。你想把它变成答案吗? (或者提示 SergeBallesta 在他的答案中添加参考和推理)
标签: c++ c++11 language-lawyer static-initialization