Информация об изменениях

Сообщение Re[10]: constexpr - разочарование от 14.06.2017 19:00

Изменено 14.06.2017 19:40 N. I.

Re[10]: constexpr - разочарование
Дрободан Фрилич:

ДФ>Конкретный пример, один компилятор проверяет все ветки на соответствие constexpr-у, а другой только те что вычисляются.


По правилам C++11/14/17 невычисляющиеся подвыражения на константность всего выражения не влияют:

A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression (3.2), but subexpressions of logical AND (5.14), logical OR (5.15), and conditional (5.16) operations that are not evaluated are not considered [ Note: An overloaded operator invokes a function.—end note ]:


Формулировка касательно игнорирования невычисляющихся подвыражений появилась в 4-й ревизии proposal-а по Generalized Constant Expressions N2116 (2006 г.) и вошла в черновик C++0x N2369 в 2007-ом году. Соответственно, компиляторы, которые этому правилу не следуют, либо какие-то реально олдскульные, либо просто забагованные по данной части.
Re[10]: constexpr - разочарование
Дрободан Фрилич:

ДФ>Конкретный пример, один компилятор проверяет все ветки на соответствие constexpr-у, а другой только те что вычисляются.


По правилам C++11/14/17 невычисляющиеся подвыражения на константность всего выражения не влияют:

С++11:

A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression (3.2), but subexpressions of logical AND (5.14), logical OR (5.15), and conditional (5.16) operations that are not evaluated are not considered [ Note: An overloaded operator invokes a function.—end note ]:


C++14/17:

A conditional-expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:


Формулировка касательно игнорирования невычисляющихся подвыражений появилась в 4-й ревизии proposal-а по Generalized Constant Expressions N2116 (2006 г.) и вошла в черновик C++0x N2369 в 2007-ом году. Соответственно, компиляторы, которые этому правилу не следуют, либо какие-то реально олдскульные, либо просто забагованные по данной части.