为什么混合通用参考和 SFINAE 不起作用

问题描述 投票:0回答:1

有人可以帮助我理解为什么下面的代码无法编译。

#include <iostream>
#include <vector>
template<typename T, T::size_type* = nullptr>
void foo(T &&val)
{
    for(auto elem: val)
    {
        std::cerr<<elem<<", ";
    }
    std::cerr<<std::endl;
}
int main()
{
    std::vector<int> v = {1,2,3};
    
    foo(v);
    return 0;
}

它给出以下错误

错误:‘std::vector&’不是类、结构或联合类型

我尝试添加类型名称,但遇到了同样的错误

template<typename T, typename T::size_type* = nullptr>

如果我将

foo(T &&val)
的签名更改为 void
foo(const T &val)

,它就会开始工作
c++ templates sfinae forwarding-reference c++-templates
1个回答
0
投票

调用

foo(v);
导致在这里推论
T

template<typename T, T::size_type* = nullptr>

std::vector<int> &
(不是
std::vector<int>
)。 您会收到错误,因为
std::vector<int> &::size_type
无效。

要修复此问题,请将行更改为:

template<typename T, std::remove_reference_t<T>::size_type* = nullptr>
© www.soinside.com 2019 - 2024. All rights reserved.