можно использовать неконстантное значение без сохранения состояния в постоянном выражении? - PullRequest
0 голосов
/ 20 февраля 2019

Страница обмена стеками:

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.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете передавать ссылки на не- constexpr данные constexpr функциям;если вы никогда не используете ссылку, проблем нет.

struct A{
  int x=7;
  A()=default;
  A(int in):x(in){}
  constexpr A(A const&) {};
};

A a=rand();
constexpr auto b = a;
int main(){}

Ваш пустой тип просто делает копию ctor constexpr и никогда ничего не читает.Copy ctor ничего не копирует, поэтому не имеет значения, что его ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...