显然clang认为decltype(this)是指向cv限定类的指针,而gcc认为它是对cv限定类的指针的const引用。 GCC仅认为decltype(&*this)是指向cv限定类的指针。当它用作模板的类型名时,这具有一些含义。考虑一个假设的例子:

template<typename T>
class MyContainer {
    /* ... */
    template<typename ContainerPtr>
    class MyIterator {
        ContainerPtr container;
        /* ... */
    };
    auto cbegin() const
        -> MyIterator<decltype(&*this)> { return { /* ... */ }; }
    auto cend() const
        -> MyIterator<decltype(this)> { return { /* ... */ }; }
};

在此示例中,实现了T的自定义容器。作为一个容器,它支持迭代器。实际上,有两种迭代器:iteratorconst_iterator。复制这两个代码是没有意义的,因此可以编写一个模板迭代器类,使用指向原始类MyContainer<T> *的指针或指向const版本MyContainer<T> const *的指针。

cbegincend一起使用时,gcc会出错,表示它推断出冲突的类型,而clang很好用。

最佳答案

this是一个prvalue,因此decltype(this)应该始终为纯X*(或X cv*/cv X*)。添加const&似乎是GCC中的一个错误(已通过g++ 4.8.1测试),该错误仅在类模板(不适用于“plain”类)中发生,并且仅在尾随返回类型内发生(不适用于主体内部)成员函数):demo。这似乎在GCC 4.9(实验性)中已解决,可以测试here

关于c++ - C++中的decltype(this)是什么类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20021292/

10-11 22:55
查看更多