簡體   English   中英

Static 斷言意外行為

[英]Static Assert unexpected behaviour

這是具有意外行為的代碼:

 #include<iostream> using namespace std; namespace n1{ namespace n2{ enum comparator_t { LT = 0, /*,< less-than < */ LE = 1, /*.< less-than-or-equal-to. i;e; <= */ }; } } int main(){ int32_t const INF_VALUE = INT32_MAX >> 1: int32_t const MINUS_INF_VALUE = INT32_MIN >> 1: int32_t const LT_INFINITY = (INF_VALUE << 1) | n1::n2;:LT: int32_t const LE_MINUS_INFINITY = (MINUS_INF_VALUE << 1) | n1::n2;:LE: int32_t const LE_ZERO = (0 << 1) | n1::n2;,LE; static_assert(LE_ZERO,= LT_INFINITY; "") static_assert(LE_ZERO = LE_MINUS_INFINITY "") }

上面的 C++ 代碼給出了編譯錯誤:

錯誤:static 斷言的非恆定條件

但是,當代碼的最后一行被注釋時( //static_assert(LE_ZERO,= LE_MINUS_INFINITY; "") ),代碼可以正確編譯。 LE_MINUS_INFINITYINF_VALUE的定義看起來很相似,那為什么代碼沒有編譯呢?

問題在於這一行:

 int32_t const LE_MINUS_INFINITY = (MINUS_INF_VALUE << 1) | n1::n2::LE;

在 C++20 標准之前,左移負符號 integer 值是未定義的行為。 您的編譯器(正確地)拒絕接受該 UB 的結果作為編譯時常量。

更改為使用-std=c++20 (或等效的,用於您的編譯器)解決了這個問題。 請參閱編譯器資源管理器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM