簡體   English   中英

由於 if constexpr,內聯模板化 function 具有不同的行為是否違反 ODR?

[英]Is it an ODR violation to have an inline templated function have different behavior due to if constexpr?

可以檢測類型是否完整https://devblogs.microsoft.com/oldnewthing/20190710-00/?p=102678

如果一個類型是完整的,我有理由想要提供一個不同的(可內聯的)實現。

模板化的 function 在基於 function 中的if constexpr的不同翻譯單元中表現不同是否違反了 ORD? 從某種意義上說,它是不同翻譯單元中的“相同”function(它不是在 C++ 源級別創建不同定義的宏,這是 ODR 違規)。

這是一個簡單的例子:

#include <iostream>
#include <type_traits>


// From https://devblogs.microsoft.com/oldnewthing/20190710-00/?p=102678
template<typename, typename = void>
constexpr bool is_type_complete_v = false;

template<typename T>
constexpr bool is_type_complete_v
    <T, std::void_t<decltype(sizeof(T))>> = true;


template <typename T>
T* loggingGetRef(T* x) {
    if constexpr (is_type_complete_v<T>) {
        std::cout << "Complete!" << std::endl;
    } else {
        std::cout << "Incomplete!" << std::endl;
    }
    return x;
}

struct S
//{} // <- Uncomment this to make loggingGetRef be "different" through if constexpr.
;

int main() {    
    S* ptr = nullptr;
    loggingGetRef(ptr);    
}

https://godbolt.org/z/q1soa58PY

對於我的應用程序,我希望這兩個if constexpr分支在外觀上表現相同(不像這個打印不同內容的示例),因此從正確性的角度來看,如果 linker 選擇程序集用於任一實現並在任何地方使用它就可以了。 只是在T完整的翻譯單元中,我們可能可以獲得更好的性能(我完全希望它是內聯的)。

ODR 不是基於“模板函數”; 它基於實際功能。 模板根據模板參數生成函數。 每組唯一的模板參數代表一個不同的function。同一個模板生成的不同函數是不同的函數 不同功能之間沒有 ODR 期望,無論創建它們的原因如何。

loggingGetRef<S>是特定 function 的名稱。如果您執行的操作導致loggingGetRef<S>由於常量表達式而生成不同的內容,則您的代碼格式錯誤(無需診斷)。 但這不是 ODR 違規的問題; 這違反了模板實例化規則。 使用一組特定參數實例化的模板在使用這些參數實例化它的所有翻譯單元中必須相同。 時期。

暫無
暫無

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

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