Если я инициализирую переменную constexpr
foo
значением, отличным от значения по умолчанию, в одной единице перевода, а затем инициализирую другую переменную constexpr
bar
с foo
в другой единице перевода, возможно ли это для bar
должен быть инициализирован до foo
, что приведет к bar
, который был инициализирован инициализированным нулем или по умолчанию foo
. то есть в отличие от случая, не связанного с constexpr (где действует статический порядок инициализации fiasco), будет ли компилятор и компоновщик анализировать упорядочение зависимостей, чтобы гарантировать правильный результат?
Кроме того, как влияют шаблоны переменных constexpr? Их порядок инициализации не определен В пределах единичных единиц перевода.
C ++ 17 стандартных ответов предпочтительнее.
UPDATE:
Вот минимальный пример. Оно работает; Это проблема. На данный момент я на 99% уверен, что это безопасно от Статический порядок инициализации Fiasco (TSIOF) . Однако из-за крайней, коварной природы этой проблемы мне нужно получить подтверждение, что это нормально. Я полагаю, этот код не страдает от TSIOF, так как включение y.h в x.h приказов a
и b
в единице перевода x.cc. Однако в AFAIU есть 2 единицы перевода: одна содержит a, другая содержит b. Кроме того, AFAI-sort-of-U ошибка множественного определения a
не возникает, поскольку ключевое слово static передает внутреннюю связь , но a
все еще имеет глобальную scope .
скомпилировано с:
clang++ -std=c++17 x.cc y.cc #or g++
возможный вывод:
in foo
возможный вывод:
assertion failed (core dumped)
файл x.cc:
#include "x.h"
int main(){ assert(b == 42); foo(); }
файл x.h:
#pragma once
#include "y.h"
static constexpr int b = a+1;
file y.cc:
#include "y.h"
#include <iostream>
void foo(){
std::cout << " in foo \n";
}
file y.h:
#pragma once
static constexpr int a=41;
void foo();
Эта программа гарантирует вывод in foo
?
Поскольку на этот вопрос нельзя ответить в качестве примера, ему действительно нужен языковой адвокат для предоставления соответствующих стандартных цитат
Этот вопрос о STIOF в разных единицах перевода. Связанный без ответа вопрос о STIOF в единицах перевода для шаблонных переменных: здесь