Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates constexpr类型转发失败_Templates_C++11_Constexpr - Fatal编程技术网

Templates constexpr类型转发失败

Templates constexpr类型转发失败,templates,c++11,constexpr,Templates,C++11,Constexpr,我很好奇为什么类型检查在使用constexpr函数转发时失败。我认为这与替换有关,但不知道具体是因为什么规则 #include <iostream> #include <type_traits> #include <vector> #include <cassert> template <typename T, typename = void> struct is_iterator { static constexpr boo

我很好奇为什么类型检查在使用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");
}
#包括
#包括
#包括
#包括
模板
结构是迭代器{
静态constexpr bool值=false;
};
模板
结构是迭代器::值>::类型>{
静态constexpr布尔值=真;
};
模板
constexpr bool isTypeIterator()
{
返回值为_iterator::value;
}
int main()
{
std::vec;
static_assert(!is_iterator::value,“很清楚这是为什么”);
静态断言(!是类型迭代器,“我想知道为什么它是反向的”);
}

因为
是类型迭代器
是指向函数的非空指针,而不是对函数的调用。使用
is\u type\u iterator()
获得预期结果

或者,如果希望保留不带括号的语法,可以尝试使用C++14变量模板:

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

你的意思是写
isTypeIterator()
?您是否在函数调用中添加了括号?如果你真的在调用函数而不是比较它的函数指针,这应该是可行的。