默认模板模板参数值是否推导上下文?
Is default template template parameter value deduced context?
我真的很惊讶 gcc 和 clang 都接受这个代码:
#include <iostream>
#include <vector>
#include <type_traits>
template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y>) {
}
int main() {
static_assert(std::is_same<decltype(foo(std::vector<int>{})), std::allocator<int>>::value);
}
gcc 和 clang 是否正确认为默认模板模板参数的值是推导上下文还是编译器扩展?
写的时候
template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y>);
相当于
template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y, T>);
所以T
可以推导出
我真的很惊讶 gcc 和 clang 都接受这个代码:
#include <iostream>
#include <vector>
#include <type_traits>
template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y>) {
}
int main() {
static_assert(std::is_same<decltype(foo(std::vector<int>{})), std::allocator<int>>::value);
}
gcc 和 clang 是否正确认为默认模板模板参数的值是推导上下文还是编译器扩展?
写的时候
template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y>);
相当于
template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y, T>);
所以T
可以推导出