如何将 decltype 应用于运算符 [] 声明中的成员函数

How to apply decltype to member function in declaration of operator[]

本文关键字:声明 成员 函数 decltype 应用于 运算符      更新时间:2023-10-16
template <typename T>
class smart_ptr
{
public:
    // ... removed other member functions for simplicity
    T* get() { return ptr; }
    template <typename U>
    auto operator [](U u) const -> decltype((*get())[u])
    {
        return (*get())[u];
    }
    template <typename U>
    auto operator [](U u) -> decltype((*get())[u])
    {
        return (*get())[u];
    }
/*
    // These work fine:
    template <typename U>
    int operator [](U u)
    {
        return (*get())[u];
    }
    template <typename U>
    int& operator [](U u)
    {
        return (*get())[u];
    }
*/
private:
    T* ptr;
};
struct Test
{
};
struct Test2
{
    int& operator [](int i) { return m_Val; }
    int operator [](int i) const { return m_Val; }
    int m_Val;
};
int main()
{
    smart_ptr<Test> p1;
    smart_ptr<Test2> p2;
    p2[0] = 1;
}

错误:

prog.cpp: In function 'int main()':
prog.cpp:55:9: error: no match for 'operator[]' in 'p2[0]'

IDONE: http://ideone.com/VyjJ28

我试图使smart_ptr的operator []T::operator []的返回类型一起使用,而无需显式指定int返回类型。但是,从上面可以明显看出,编译器未能编译代码。如果有人能帮助我,我将不胜感激。

似乎你想要更好的编译器错误。以下是 clang 对这个来源的看法(嗯,它说的更多,但这描述了问题):

decltype.cpp: In instantiation of ‘class smart_ptr<Test>’:
decltype.cpp:53:21:   required from here
decltype.cpp:9:51:error: cannot call member function ‘T* smart_ptr<T>::get() [with T = Test]’ without object
     auto operator [](U u) const -> decltype((*get())[u])       
                                                   ^

该问题的解决方法是在对象上调用get(),例如:

auto operator[](U u) const -> decltype((*this->get())[u])

(当然,这也要求有一个const成员get())。