C 標準在[temp.type]#2.7中說,
如果兩個值具有相同的型別并且 ... (2.7) 它們是參考型別并且它們參考相同的物件或函式,則它們是模板引數等效的
這與在非模板代碼中比較參考型別的方式不同。比如說
template <auto& x1, auto& x2>
constexpr bool equal_tmpl = false;
template <auto& x>
constexpr bool equal_tmpl<x, x> = true;
和
consteval bool equal_fun(auto& x1, auto& x2)
{
return x1 == x2;
}
意味著不同的東西。equal_tmpl比較地址,但equal_fun比較值:
constexpr int i = 123;
constexpr int j = 123;
static_assert(equal_tmpl<i, j> != equal_fun(i, j));
為什么在標準中這樣定義?模板中的相等性與非模板代碼中的作業方式不一樣嗎?演示。
uj5u.com熱心網友回復:
出于模板引數等價的目的,我們要問的問題是“這兩個引數是否相同?” 而不是“這兩個引數是否相等?”
對具有相同值的兩個不同變數的參考可能彼此相等,但它們并不相同:一個不能替代另一個。想象一下,如果我們有這個:
template <const int& r>
constexpr auto foo() { return &r; }
如果標準這么說foo<i>并且foo<j>是相同的功能,那是否有意義?因為i == j(在哪里i和j在問題中定義)?No.foo<i>是回傳 的地址的函式, 是回傳 的地址i的foo<j>函式,j這兩個地址不一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/428004.html
