後端工坊 2026 年 6 月 14 日

2026-06-14 — C++26 結構化綁定支援 Pack、Linux 7.0 overlayfs UUID 放寬、MSVC v14.52 Preview 模組與 ARM64 更新

primary=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p1061r10.html primary=https://github.com/torvalds/linux/commit/0ba83f0 primary=https://devblogs.microsoft.com/cppblog/msvc-build-tools-preview-updates-june-2026 primary=https://github.com/microsoft/STL/wiki/Changelog#msvc-build-tools-1452

C++26 結構化綁定正式支援 Pack 展開

open-std.org · 2024 年(P1061R10 定稿,C++26 採納)

背景

C++17 引入結構化綁定(structured bindings),允許將 tuple 或聚合型別分解成具名變數。然而,若想在泛型程式中反向操作——把 tuple 的元素展開成 parameter pack——卻必須借助笨重的 std::apply()index_sequence 技巧,嚴重限制模板程式碼的可讀性。提案 P1061R10 正是為了填補這個空缺而生,已於 C++26 週期正式採納。

核心改動

新語法允許在結構化綁定中使用 ... 省略號,將指定位置的元素收集為一個 pack。Pack 可放在首、中、尾任意位置,但一條綁定宣告中只能出現一個 pack,多個 pack 的寫法(如 auto [...a, ...b] = f();)屬於 ill-formed。

std::tuple<X, Y, Z> f();

auto [x, y, z]       = f();  // C++17:逐一命名
auto [...xs]         = f();  // C++26:xs 是含三個元素的 pack
auto [x, ...rest]    = f();  // x 取第一個,rest 收後兩個
auto [x, ...mid, z]  = f();  // z 取最後一個,mid 取中間
auto [...a, ...b]    = f();  // ill-formed:不允許兩個 pack

規格細節

P1061R10 相比早期草案做了重要縮減:pack 展開僅在模板語境(template context)中合法,先前提案的「隱式模板區域」(implicit template region)因實作複雜度過高,已由 Evolution Working Group 否決並從 R10 起移除。這使得規格更易實作,也減少了與現有語言規則的衝突。下方展示以 pack 重寫的點積函式,對比傳統需要巢狀 lambda 的寫法更為簡潔:

// C++26:pack 版本
template <class P, class Q>
auto dot_product(P p, Q q) {
    auto&& [...p_elems] = p;
    auto&& [...q_elems] = q;
    return (... + (p_elems * q_elems));
}

影響範圍

此特性與 C++26 的其他結構化綁定改進——包括在 if 初始化陳述式中使用、個別綁定加注屬性(attribute)以及 constexpr 綁定——共同大幅強化了結構化綁定在泛型程式中的表達力。對於大量操作 tuple-like 型別的函式庫作者而言,這將明顯減少樣板程式碼的數量。目前各主要編譯器對此特性的支援仍在實作中,開發者可追蹤各自編譯器的 C++26 支援狀態。

原始來源:P1061R10 — Structured Bindings can introduce a Pack(open-std.org)


Linux 7.0 overlayfs 更新:放寬 UUID 驗證限制,支援 btrfs 複製卷場景

torvalds/linux · 2026 年 2 月(合併入 Linux 7.0,LWN.net 2026-06 報導)

原本的問題

overlayfs 的 uuid=off 掛載選項原本要求所有下層(lower)與上層(upper)目錄都必須位於同一個底層檔案系統,目的是確保 inode 號碼不會衝突。然而,這條限制在 btrfs 快照/複製(clone)情境下造成實際困境:btrfs 子卷複製所產生的 UUID 是短暫性的(ephemeral),若上層目錄又掛在不同的檔案系統上,舊有的驗證邏輯會直接拒絕掛載。

採用的方法

此次合併(commit 0ba83f0)由 Amir Goldstein 主導,調整了 super.c 中的驗證邏輯,並在 overlayfs.hnamei.c 新增了 ovl_uuid_match() 輔助函式,集中處理 UUID 比對。修改後,UUID 一致性要求僅套用於下層目錄之間,上層目錄可以來自不同的檔案系統,不再因此觸發回退至 uuid=null 的警告。

  • 修改檔案:overlayfs.hnamei.csuper.coverlayfs.rst(文件)
  • 淨差異:+24 / -20 行
  • 同批合併另含 UUID 語意放寬後的文件更正

實際效果

調整後,uuid=off 的語意從「停用所有 UUID 檢查」修正為「放寬 UUID 檢查」,行為更貼近文件描述。使用 btrfs 複製卷作為 overlayfs 下層、搭配不同檔案系統作為上層的容器或沙箱方案,可直接受益於此變更,無需額外的掛載參數調整。同週期的其他 overlayfs 改進還包括 SELinux mmap/mprotect 存取檢查修正(Paul Moore)、fsync 後設資料 copy-up 改為選配掛載參數(Fei Lv),共同提升 Linux 7.0 中 overlayfs 的穩定性。

原始來源:linux/commit/0ba83f0 — overlayfs UUID semantics relaxation(GitHub);另見 LWN.net #1077052


MSVC Build Tools v14.52 Preview 六月更新:模組穩定性與 ARM64 效能齊進

Microsoft C++ Blog · 2026 年 6 月 11 日

背景

微軟於 2026 年 6 月 11 日釋出 MSVC Build Tools Preview,目標版本為 v14.52cl.exe / link.exe 回報版號至少為 19.52.36418)。此 Preview 可透過 Visual Studio 2026 Stable 或 Insiders 頻道取得,後者每週更新。本次更新橫跨編譯器前端、後端、連結器、標準函式庫及周邊工具,共修復 27 個開發者社群回報的問題。

核心改動

C++ Modules 獲得多項可靠性修復,包括含 if constexpr 搭配 requires 運算式的可變參數模板類別崩潰問題、import std 建置失敗,以及從 header unit 匯入時 __VA_OPT__ 巢狀括號處理錯誤。ARM64 後端新增 SVE(Scalable Vector Extension)型別進入 SSA 最佳化器的支援,並消除多餘的向量建構操作,在目標基準測試中達到 2–3% 的效能提升。

  • ARM64:消除多餘向量建構、位元欄位指令立即運算元縮窄、向量記憶體 intrinsic 規範化
  • x64/x86:多位元組複製傳播正確性修復、乘法強度縮減的 overflow flag 保留
  • 一般最佳化:inliner 回傳值成本分析、函式指標去虛擬化記憶體模型改善、/fp:fast 以外的常數型別轉換折疊

規格細節

連結器與 PDB 方面,DIA 新增 x64 unwind V3 偵錯支援,並修正 alloca 函式的 epilog unwind code 錯誤。標準函式庫(STL)Changelog 記錄了 11 條 LWG 決議合併,涵蓋 optional/variant emplace 一致性、mdspan 元素型別物件限制,以及 ARM64/ARM64EC 向量化 reverse()/ranges::reverse 實作。前端一致性方面,修正了 <numbers> 標頭與名為 e 的變數或型別衝突的編譯錯誤,以及廢棄非純虛擬函式覆寫的新警告。

影響範圍

此 Preview 面向已採用或計畫採用 C++ Modules 的專案,以及在 ARM64 目標上追求效能的團隊。針對 chained function 呼叫的二次複雜度演算法也已重構,大型程式碼庫的前端處理吞吐量因此提升。開發者可至 aka.ms/msvc/preview 設定 Preview 元件,並在 Visual Studio Developer Community 回報問題。

原始來源:MSVC Build Tools Preview Updates – June 2026(Microsoft C++ Blog);STL 詳細變更見 STL Changelog


End of article
0
Would love your thoughts, please comment.x
()
x