模板转换运算符正在返回对数组的引用

Template conversion operator returing reference to array

本文关键字:数组 引用 返回 转换 运算符      更新时间:2023-10-16

我读到了这个问题和其他一些东西:在某些情况下typedef是绝对必要的吗??

我写了这个代码:

const int arrayOfInt[10] = {0};
template<typename T, int N> using X = const T (&)[N];
struct foo
{
    template<typename T, int N> operator  X<int,10> () { return arrayOfInt;  }
};
void bar(const int (&) [10]) {}
int main()
{
    bar(foo());
    return 0;
}

c++11的using特性对我不起作用,而且我也无法思考如何在这种情况下typedef返回类型,因为我的类foo本身不是模板。我需要看到使用using关键字和typedef两者的解决方案。非常感谢SO的人民:)

由于X是一个别名模板,因此需要显式提供模板参数;它们不会从周围的范围被捕获:

struct foo
{
    template<typename T, int N> 
    operator X<T,N>() { return arrayOfInt; }
    //        ^^^^^
};

使用typedef不能做到这一点,因为没有typedef模板这样的东西。

template<typename T, int N> operator  X<int,10> () { return arrayOfInt;  }

模板自变量T和N永远不会被使用,因此永远不会被推导。

固定在Coliru上直播

const int arrayOfInt[10]{0};
template<typename T, int N> using X = T const (&)[N];
struct foo {
    template<typename T, int N> operator  X<T,N> () const { return arrayOfInt;  }
};
void bar(const int (&) [10]) {}
int main()
{
    foo f;
    X<int, 10> v = f;
    bar(foo());
}