我merily新尾隨返回類型,我在那裏打了一個問題,這個(簡化)代碼的實驗尾隨返回類型,decltype和常量性
#include <list>
class MyContainer{
std::list<int> ints;
auto begin() -> decltype(ints.begin())
{
return ints.begin();
}
auto begin() const -> decltype(ints.begin())
{
return ints.begin();
}
};
忽略的這段代碼是如何毫無意義的事實。最重要的部分是使用GCC 4.6.1時產生的編譯器錯誤(與-std=c++0x
標誌):
In member function 'std::list<int>::iterator MyContainer::begin() const':
error: could not convert '((const MyContainer*)this)->MyContainer::ints.std::list<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator<int>, std::list<_Tp, _Alloc>::const_iterator = std::_List_const_iterator<int>]()' from 'std::list<int>::const_iterator {aka std::_List_const_iterator<int>}' to 'std::list<int>::iterator {aka std::_List_iterator<int>}'
如果你不涉及模板錯誤的風扇,短篇小說的是,在的身體const
版本的MyContainer::begin
,表達式ints.begin()
返回類型std::list<int>::const_iterator
的值(因爲ints
在這種情況下爲const
)。然而,當決定表達式的類型時,decltype(ints.begin())
產生std::list<int>::iterator
類型,即,decltype
忽略const
方法的限定符begin
方法。毫不奇怪,類型的衝突是結果。
這對我來說似乎是GCC編譯器中的一個錯誤。只有decltype
才能符合const
限定符並生成const_iterator
類型。任何人都可以證實或否認(甚至可以解釋)這個嗎?也許我在decltype
的機制中忽略了一些東西,但是這看起來像一個非常簡單的場景。
注意:據我所知,相同的行爲不僅適用於std::list<int>
,也適用於任何類型的成員函數重載的const
-這些類型返回不兼容的類型。
用gcc 4.7.0的最新快照編譯沒有錯誤。在這之前,我想你會陷入'ints.cbegin()' – Cubbi
當然,在這樣一個微不足道的情況下,這並不是一個嚴重的障礙,但對於gcc來說,爲所有非平凡的案例也想確保*我*是正確的 - 我不想使用我不明白的功能)。 –