我對這個 C 代碼感到困惑:
template <class T>
struct Foo {
T value;
};
int main() {
return Foo<int>(0).value;
// Below code works as well in gcc
// return Foo(0).value;
}
它使用 C 20 標準(但不是 C 17 標準)和最新的 MSVC 中的 GCC 10 編譯,但不能使用 clang 13 或 14,即使在 C 20 中也是如此。
根據標準(來自cppreference)Foo,至少在指定模板型別時應該可以實體化。
為什么這與 C 20 相關?我在模板推導規范中沒有看到任何變化(我可能錯過了一些東西)。
另外(這很奇怪),C 20 模式下的 GCC 甚至在我們呼叫時Foo不指定模板型別 ( Foo(0))也會編譯。
Godbolt 鏈接 在這里
uj5u.com熱心網友回復:
它使用 C 20 標準(但不是 C 17 標準)和最新的 MSVC 中的 GCC 10 編譯。
這是因為 GCC 10 和最新的 MSVC 實作允許從帶括號的值串列初始化聚合,這允許我們使用括號來初始化聚合。
另外(這很奇怪),C 20 模式下的 GCC 甚至在我們呼叫 Foo 而不指定模板型別 (
Foo(0))時也會編譯。
這是因為 GCC 10為聚合實作了類模板引數推導,這使得T自動推導為int.
請注意,clang 目前沒有實作這兩個 C 20 特性,因此您的代碼不能被 clang 接受。
您可以參考cppreference來獲取當前編譯器對 C 20 特性的支持。
uj5u.com熱心網友回復:
關于你的鏈接,編譯器會告訴你你的呼叫有什么問題:
錯誤:沒有匹配的函式呼叫'Foo::Foo(int)'
所以,問題是你試圖呼叫一個不存在的建構式。您的類只有Foo默認建構式Foo()。
只需更改return Foo<int>(0).value;為return Foo<int>().value;,它就會起作用。否則你將需要一個像Foo(T) {}.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376718.html
上一篇:如何在C 模板中將foo<constbar>隱式轉換為constfoo<bar>?
下一篇:C 中的部分類模板引數推導
