Страница обмена стеками:
https://softwareengineering.stackexchange.com/questions/386602/any-need-for-constexpr-in-tag-values
содержит следующий оператор:
Переменные уровня пространства имен и переменные статического классаможет использоваться только в контексте constexpr, если они сами являются constexpr, исключение составляют классы и структуры, которые являются полностью пустыми.
, что подразумевает, IIUC, следующее утверждение «stateless are are constexpr»:
неконстантная переменная полностью пустого типа (иначе говоря, без состояния) может использоваться в константном выражении.
Однако даже после серьезного изучения:
7.7 Постоянные выражения [expr.const]
из:
http://www.open -std.org / jtc1 / sc22 / wg21 /docs /apers / 2019 / n4800.pdf
Я не вижу нигде в разделе 7.7, где говорится или подразумевается то, что говорится в приведенном выше утверждении «stateless are are constexpr».В нем упоминаются буквальные значения, но ничего не говорится о неконстантных значениях без сохранения состояния.
Может кто-нибудь объяснить, как вышеприведенное утверждение может быть выведено из того, что говорится в разделе 7.7 или любом другом разделе n4800?Я сам могу логически вывести это из того факта, что переменная без состояния может иметь только одно значение, так же как литерал 1 может иметь только одно значение, но я не могу вывести это из раздела 7.7 n4800 без посторонней помощи.
Более конкретно, используя код со страницы stackexchange, как n4800 говорит, что:
struct A {};
A a_global;
constexpr auto a_cexpr = a_global;
будет компилироваться?Кроме того, показывает ли компилируемость приведенного выше кода, что a_global может использоваться в константном выражении?Если нет, то как правильно это показать?
Обратите внимание, что два компилятора, которые я использовал, компилируют его, но я хотел бы получить некоторые гарантии того, что они верны.
TIA.