鑒于C 標準庫不提供 cmath 函式的 constexpr 版本,請考慮下面的程式。
#include <cmath>
#include <cstring>
int main()
{
constexpr auto a = std::pow(2, 10);
constexpr auto b = std::strlen("ABC");
}
正如預期的那樣,MSVC 和 clang 無法編譯它,因為constexpr變數是從未宣告的函式初始化的constexpr。
但是,g 會編譯它。g 的版本似乎無關緊要。
(在編譯器資源管理器中查看它們)
g 是如何做到這一點的?這是正確的(允許的)編譯器行為嗎?
uj5u.com熱心網友回復:
LWG 2013的決議是不允許實作將非constexpr函式宣告為constexpr,因此 gcc 是不符合的,允許在編譯時評估這些。
也就是說,GCC 實際上并沒有將所需的函式標記為constexpr. 相反,它所做的是很早就用__builtin_powand替換這些呼叫__builtin_strlen,它可以在編譯時計算(std::版本呼叫 libc 版本,而不能)。這是一個編譯器擴展。
如果你用 編譯-fno-builtin,它也不能同時編譯std::pow和std::strlen,但是你可以通過顯式寫出__builtin_pow(2, 10)和來讓clang 和GCC 編譯它__builtin_strlen("ABC")。
uj5u.com熱心網友回復:
如前所述,C 標準庫目前不支持constexprcmath 函式的計算。但是,這并不能阻止單個實作具有非標準代碼。GCC 有一個不合格的擴展,允許constexpr評估。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397880.html
上一篇:編譯我的專案時遇到C 編譯問題
