在C 20中,模板函式可以用auto關鍵字和省略template<class T>前綴的簡化方式來宣告。但是如果一個模板函式的第二個/第三個/...引數型別依賴于第一個模板引數型別,使用auto的宣告是否等同于?
考慮一個老式模板的例子:
template<typename T>
void f(T x, std::optional< T> y, std: :array<char,sizeof(T)> z)。
同樣的模板函式宣告用auto語法將是:
void g(auto x, std: :optional<decltype(x)> y, std::array<char,sizeof(x)> z>/span>。
不幸的是,Visual Studio 2019 16.11.2拒絕了第二個變體,并出現了錯誤:
error C3539: a template-argument cannot be a type that contains 'auto'。
錯誤C3540:sizeof不能應用于一個包含'auto'的型別。
演示。https://gcc.godbolt.org/z/vc6bE14jh
這只是Visual Studio的一個限制/bug嗎?
uj5u.com熱心網友回復:
是的,這是一個MSVC的bug,但是g和f在這里是不一樣的,因為g只從它的第一個引數進行推導(這可能是也可能不是你想要的)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/316118.html
標籤:
