是默认模板模板参数值推导上下文?

时间:2016-12-07 20:44:48

标签: c++ templates template-templates

我真的很惊讶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是正确的,默认模板模板参数的值是推导上下文还是编译器扩展?

1 个答案:

答案 0 :(得分:5)

写作时

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