如果我初始化constexpr变量foo在一个翻译单元,其具有非缺省值,然后一个初始化另一个constexpr变量bar与foo在另一翻译单元有可能是bar之前被初始化foo导致bar,是由初始化为零或缺省初始化foo。即与在非constexpr情况下(静态初始化顺序彻底失败有效)不同,编译器和链接器是否将分析依赖性顺序以确保正确的结果?
另外,constexpr变量模板如何受到影响?在单个翻译单元中,它们的初始化顺序是不确定的。
首选C ++ 17标准答案。
更新:这是一个最小的示例。有用; 那就是问题所在。至此,我99%确信这可以通过静态初始化命令惨败(TSIOF)来解决。但是,由于该问题的极端,阴险性质,我需要确认这是可以的。我相信该代码不会受到TSIOF的困扰,因为在xh命令a和bx.cc转换单元中包含了yh 。但是,AFAIU有2个翻译单元:一个包含a,另一个包含b。此外,AFAI-sort-of-U对a错误的多重定义不会出现,因为static关键字具有内部链接,但a仍然具有全局范围。
编译为:
clang++ -std=c++17 x.cc y.cc #or g++
Run Code Online (Sandbox Code Playgroud)
可能的输出:
in foo
Run Code Online (Sandbox Code Playgroud)
可能的输出:
assertion failed (core dumped)
Run Code Online (Sandbox Code Playgroud)
文件x.cc:
#include "x.h"
int main(){ assert(b == 42); foo(); }
Run Code Online (Sandbox Code Playgroud)
文件xh:
#pragma once
#include "y.h"
static constexpr int b = a+1;
Run Code Online (Sandbox Code Playgroud)
文件y.cc:
#include …Run Code Online (Sandbox Code Playgroud)