#include <initializer_list>
struct Foo
{
template <typename T>
Foo(std::initializer_list<T>) {}
template <typename T>
Foo(std::initializer_list<typename T::BarAlias>) {}
};
struct Bar
{
using BarAlias = Bar;
};
int main()
{
Foo foo{ Bar{} };
}
我相信編譯器應該在Foo. 為什么它甚至有效?
uj5u.com熱心網友回復:
您有兩個模板引數不相關的模板T。對于作為候選人的第二個建構式T,至少應該是可推匯出的。然而,在
template <typename T>
Foo(std::initializer_list<typename T::BarAlias>) {}
T是在一個非推導的背景關系中。因此,由于 SFINAE,此建構式將始終被拒絕。
請注意您的代碼與
template<class T>
struct Foo {
Foo(std::initializer_list<T>);
Foo(std::initializer_list<typename T::BarAlias>);
};
這Foo<Bar> foo{Bar{}};確實會產生您期望的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/335651.html
下一篇:如何將函式指標模板作為模板引數?
