相关疑难解决方法(0)

constexpr变量是否需要“静态初始化顺序失败”?

如果我初始化constexpr变量foo在一个翻译单元,其具有非缺省值,然后一个初始化另一个constexpr变量barfoo在另一翻译单元有可能是bar之前被初始化foo导致bar,是由初始化为零或缺省初始化foo。即与在非constexpr情况下(静态初始化顺序彻底失败有效)不同,编译器和链接器是否将分析依赖性顺序以确保正确的结果?

另外,constexpr变量模板如何受到影响?在单个翻译单元中,它们的初始化顺序是不确定的。

首选C ++ 17标准答案。

更新:这是一个最小的示例。有用; 那就是问题所在。至此,我99%确信这可以通过静态初始化命令惨败(TSIOF)来解决。但是,由于该问题的极端,阴险性质,我需要确认这是可以的。我相信该代码不会受到TSIOF的困扰,因为在xh命令abx.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)

c++ initialization global-variables constexpr

5
推荐指数
1
解决办法
414
查看次数

标签 统计

c++ ×1

constexpr ×1

global-variables ×1

initialization ×1