最近,在嘗試了能夠在非型別模板引數 ( P0732R2 ) 中傳遞型別別的 C 20 特性之后,我遇到了一些很奇怪的事情。
考慮以下代碼:
template <typename T>
struct abc {
T p;
consteval abc(T p) : p(p) { }
consteval operator decltype(p)() const {
return p;
}
};
template <abc obj>
consteval auto do_something1() {
return obj();
}
template <auto obj>
consteval auto do_something2() {
return obj();
}
constexpr auto fun() {
return true;
}
int main() {
static_assert(do_something1<&fun>()); // OK in Clang, fails in GCC
static_assert(do_something2<&fun>()); // OK in both GCC and Clang
}
這似乎與 clang 預期的一樣,但是 GCC 無法編譯它并給出一個錯誤,說這fun不是一個有效的模板引數。
但是,這個答案說,根據 C 標準,函式指標應該是有效的模板引數。
哪個編譯器在這里是正確的?
此外,奇怪的是,當出于某種原因修改為與成員函式一起使用時,相同的代碼似乎可以在兩個編譯器上運行。
注意:需要注意的一點是,根據此頁面,GCC 對P0732R2的支持已完成,而 Clang 仍處于部分/實驗階段。那么,這是否意味著 GCC 是正確的,并且通過非型別模板引數中的型別別傳遞函式指標是不可能的,還是我在這里遺漏了什么?
uj5u.com熱心網友回復:
哪個編譯器在這里是正確的?
Clang 是正確的,所寫的代碼是有效的。
GCC 不處理該特定情況是一個已知問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328478.html
下一篇:在C 中通過指標訪問映射元素
