2016-11-15 7 views
3

私はそれだけのコードでこれを表示する方が簡単だと思う:C++ - 型* = std :: array <type> :: iteratorと仮定できますか?

#include <iostream> 
#include <array> 

struct Test 
{}; 

int main() 
{ 
    std::array<Test, 1> arr {}; 
    Test* t = arr.begin(); 
} 

arr.beginは()イテレータを返しますが、あなたが見ることができるように私は*テストでそれを参照することができます。これは暗黙のキャストのために可能であると思われますが、これは他のコンパイラでも同様に動作すると期待できますか?

operator T*() 
{ 
    return &(*this->CONTAINER)[index]; 
} 

template <typename U> 
operator U() = delete; 

または何か他のもの:

また、それは暗黙のキャスト、EXを行うオペレータTYPEのですか?事前

答えて

1

iterator実装定義である:[container.requirements]

using iterator = implementation-defined; // see [container.requirements]

iteratorbe at leastべきであると述べている:

前方イテレータ要件を満たすイテレータカテゴリ。 X :: const_iteratorに変換可能です。彼らは、この変換演算子を有していなければならないので、これがあると

requirements of a forward iteratorInputIteratorの要件(ForwardIteratorがInputIteratorの要件を満たす必要がある)もIteratorの要件をどちらも(InputIteratorがイテレータの要件を満たす必要がある)状態非常にコンパイラ固有であり、標準ではありません。

+0

** - 1 **最後に、OPの仮説変換演算子は不要であり、 "非常にコンパイラ固有"です。逆に、そのような演算子はありません。標準に準拠しています。 –

+0

s /は標準に準拠していない/おそらく標準に準拠していない/です。私はその主張を証明するのが難しいようです。しかし、そのような演算子を持つことは、非ポインタイテレータを持つ目的と直接衝突するので、実際の実装ではそれを見つけることはできません。 –

+0

@ Cheersandhth.-Alf Fit?いいえ、私は同意します。 OPの実装にはそれがあるのでしょうか?はい、できます。標準に準拠していない実装を直接的には作成しません。私はOPが彼自身の変換演算子を作ったのではなく、実装によって提供されたものを使用することを疑う。 –

0

おかげでそれは定義された実装です:あなたのコード3. C++ 14標準§23.3.2.1数字はGCCで動作しますが、コンパイラ間でその仮定をすることはできません。

2

std::array::beginは、pointerではなく、iteratorを返します。

iteratorは、ポインタとして定義することができますが、必ずしもそうである必要はありません。

最初の項目へのポインタを取得するには、std::array::dataを使用できます。 “暗黙のキャスト”再


、いや、ここではそのようなはありません。


生ポインタにイテレータを変換するための一般的な技術は、最初にderefenceに一般に参照を生成し、そのアドレスの、&*itを取る*it、です。ただし、パックされているかどうかは実装に依存しますが、std::vector<bool>など、アドレスを取るアドレス指定可能な項目がない場合は必ず失敗します。がパックされている場合はです。このような場合、イテレータの逆参照は、未加工参照の代わりにプロキシオブジェクトを生成します。 The C++ standard draftに見られるように

関連する問題