显然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
的自定义容器。作为一个容器,它支持迭代器。实际上,有两种迭代器:iterator
和const_iterator
。复制这两个代码是没有意义的,因此可以编写一个模板迭代器类,使用指向原始类MyContainer<T> *
的指针或指向const版本MyContainer<T> const *
的指针。当
cbegin
和cend
一起使用时,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/