constexpr类型转发失败

时间:2015-08-04 08:09:39

标签: templates c++11 constexpr

我很好奇为什么在使用constexpr函数转发时类型检查失败。我认为它与替换有关,但由于什么规则不完全确切。

#include <iostream>
#include <type_traits>
#include <vector>
#include <cassert>

template <typename T, typename = void>
struct is_iterator {
    static constexpr bool value = false;
};

template <typename T>
struct is_iterator<T, typename std::enable_if<!std::is_same<typename std::iterator_traits<T>::value_type, void>::value>::type> {
    static constexpr bool value = true;
};

template <typename T>
constexpr bool isTypeIterator()
{
    return is_iterator<T>::value;
}

int main()
{
    std::vector<int> vec;
    static_assert(!is_iterator<decltype(vec)>::value, "It is clear why this works");
    static_assert(!is_type_iterator<decltype(vec)>, "I wonder why this is reversed");
}

1 个答案:

答案 0 :(得分:2)

因为is_type_iterator<decltype(vec)>是指向函数的非空指针,而不是对函数的调用。使用is_type_iterator<decltype(vec)>()获得预期结果。

或者如果你想保留没有括号的语法,你可以试试C ++ 14变量模板:

template <typename T>
constexpr bool is_type_iterator = is_iterator<T>::value;