W odniesieniu do this question. Stała stała ekspresja użyta do zainicjowania zmiennej constexpr
jest źle sformułowana. Tyle jest danych.Dlaczego nie, jeśli constexpr spowoduje, że błąd rdzenia stałego wyrażenia zniknie?
Ale gdy próbuję włączyć if
się z if constexpr
:
template <typename T>
void foo() {
constexpr int x = -1;
if constexpr (x >= 0){
constexpr int y = 1 << x;
}
}
int main(){
foo<int>();
}
błąd będzie się powtarzał. GCC 7.2 nadal daje:
error: right operand of shift expression '(1 << -1)' is negative [-fpermissive]
Ale myślałem, że semantyczny kontrola powinna być pozostawiona unpreformed na porzuconego gałęzi.
Dokonywanie zadnie poprzez constexpr
lambda nie pomaga jednak:
template <typename T>
void foo(){
constexpr int x = -1;
constexpr auto p = []() constexpr { return x; };
if constexpr (x >= 0){
constexpr int y = 1<<p();
}
}
constexpr
specifier na y
wydaje się zmieniać jak zaznaczone jest odrzucane oddział. Czy to jest zamierzone zachowanie?
@ max66 był na tyle uprzejmy, by sprawdzić inne implementacje. Zgłasza, że błąd jest powtarzalny zarówno w GCC (7.2.0/Head 8.0.0), jak i Clang (5.0.0/Head 6.0.0).
Brzmi jak błąd kompilatora. Czy próbowałeś innej implementacji? –
@ShacharShemesh - Ja sam nie. Ale PO posta, które łączyłem, informuje, że [Clang i MSVC zachowują się tak samo] (https://stackoverflow.com/questions/46510531/undefined-behavior-when-constexpr-evaluating-negative-bitshift#comment79975550_46510531). – StoryTeller
Potwierdzam problem z clang ++ 3.8.1 – max66