簡體   English   中英

我應該內聯命名空間 scope lambdas 嗎? 無論哪種情況,為什么?

[英]Should I inline namespace scope lambdas? In either case, why?

有時我在 header 文件的頂部定義了一些無捕獲的 lambda,該文件用於 header 的以下部分:

//#include statements
namespace detail {
auto constexpr lambda = [](/* args */){ /* body */ };
}
// in some function or whatever, use `lambda`

在代碼審查期間,我經常被告知我不僅應該像我一樣放置constexpr說明符,還應該放入inline說明符。

我為什么要那么做? 有什么優勢?

我已經嘗試在 cppreference 上閱讀inline說明符,但我認為目前我缺乏很多術語來理解它。

如果變量在 header 文件中定義,則應該使用inline 如果它不是內聯的,那么每個包含 header 文件的翻譯單元都將獲得該定義。 這意味着您對單個名稱有多個定義,這違反了 ODR(一個定義規則)。 這些不需要任何診斷,因此它們可能導致難以發現錯誤。

通過使變量內聯,您可以通過告訴編譯器/鏈接器它可以丟棄所有重復的定義而只使用一個來解決問題。

根據 C++ 17 標准(10.1.5 constexpr 說明符)

1 constexpr 說明符僅適用於變量或變量模板的定義或 function 或 function 模板的聲明。 使用 constexpr 說明符聲明的 function 或 static 數據成員隱式是內聯 function 或變量 (10.1.6) 如果 function 或 function 模板的任何聲明具有 constexpr 說明符,則其所有聲明都應包含 constexpr 說明符。

在您問題的代碼片段中,變量lambda不是 static 數據成員。

namespace detail {
auto constexpr lambda = [](/* args */){ /* body */ };
}

因此,如果命名空間detail具有外部鏈接,那么變量lambda也具有外部鏈接。 在這種情況下,如果 header 將包含在幾個編譯單元中,則將破壞一個定義規則。 為避免這種情況,您應該將該變量聲明為內聯變量。

暫無
暫無

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

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