constexpr 类型转发失败

constexpr type forwarding fails

我很好奇为什么使用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");
}

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

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

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