微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

右值引用和SFINAE

如何解决右值引用和SFINAE

| 我最近开始使用右值引用,但遇到一种情况,我不知道它们为什么以这种方式工作。 我试图确定一个类型是否可以调用
begin
end
。下面的代码给出了如果我将ѭ2更改为按值或const引用来接受其参数的预期结果,但是我不确定为什么使用右值引用时它不起作用,我想知道是否有人可以告诉我为什么。
#include <vector>
#include <type_traits>
#include <iostream>

template<class Container>
auto begin(Container &&c) -> decltype(c.begin()) { return c.begin(); }

template<class Container>
auto end(Container &&c) -> decltype(c.end()) { return c.end(); }

template<class T,size_t size>
T *begin(T (&array)[size]) { return (&array[0]); }

template<class T,size_t size>
T *end(T (&array)[size]) { return (&array[0] + size); }

template <typename T>
struct has_begin_end
{
    typedef char true_type;
    typedef char false_type[2];

    template <typename U> static true_type& test(decltype(begin(*((U*)0))) *b = 0,decltype(end(*((U*)0))) *e = 0);

    template <typename U> static false_type& test(...);

    enum { value = (sizeof(true_type) == sizeof test<T>(0)) };
};

template<class T>
void foo(T &&t)
{
    std::cout << has_begin_end<T>::value << std::endl;
}

int main()
{
    std::vector<int> v = {1,2};

    std::cout << has_begin_end<std::vector<int> >::value << std::endl;
    std::cout << has_begin_end<int>::value << std::endl;

    foo(v);
    foo(123);
}
    

解决方法

这是因为当用左值调用foo时,T被推导为左值引用类型。尝试:
has_begin_end<typename remove_reference<T>::type>::value
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。