Мне интересно, могу ли я полагаться на постоянную инициализацию, когда есть зависимость между двумя постоянными нелокальными переменными с плавающей запятой со статической продолжительностью хранения в двух разных единицах перевода - где одна зависит от (инициализируется на [значение]) другой , а для последнего выполняется постоянная инициализация. Я ищу ответы, содержащие и интерпретирующие соответствующую часть стандарта, в частности, стандарт 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 утверждает [курсив мой]:
Выполняется постоянная инициализация:
если каждое полное выражение (включая неявные преобразования), которое появляется в инициализаторе ссылки со статической продолжительностью хранения или продолжительностью хранения потока, является постоянным выражением (5.19), а ссылка привязана к lvalue, обозначающему объект со статической продолжительностью хранения или временной (см. 12.2);
если объект со статической продолжительностью хранения или продолжительностью хранения потока инициализируется вызовом конструктора, и если полное выражение инициализации является постоянным инициализатором для объекта;
если объект со статической продолжительностью хранения или продолжительностью хранения потока не инициализирован вызовом конструктора и если либо объект инициализирован значением, либо каждое полное выражение, которое появляется в его инициализаторе, является постоянным выражением.
В интерпретации последнего пункта, что Bar::kValue
инициализируется посредством постоянной инициализации, если Foo::kValue
является постоянным выражением. Я подозреваю, что могу найти ответ на вопрос, правда это или нет в [expr.const], но здесь я застрял.
Foo::kValue
не является постоянным выражением, потому что компилятор не может видеть свой инициализатор в другом TU, а также потому, что он не является ни целым, ни перечисляемым, ни constexpr, ни временным: timsong-cpp.github.io/cppwp/n3337/expr.const#2.9 - person Oktalist   schedule 21.05.2019Foo::kValue
объявлен как const, тогда это постоянное выражение. Где взять стоимость - другая проблема - person P. PICARD   schedule 21.05.2019