2016-05-05 16 views
-3

私はコードの一部ハーブサッターによって「デフォルトで...グッドC++ 14の作成」CppConを見て、スライドの1に従っていました:私の質問がある"each for"ループが項目に対してnullptrを返す場合?

auto p = make_shared<circle>(42); 
auto v = load_shapes(); 
for(auto& s: v) { 
    if(s && *s == *p) { 
    cout << *s << "is a match\n"; 
    } 
} 

がある理由

場合(S & & * sの==の* pを)

チェック! nullptrこと

どのように各 forループによって初期化された変数を参照することができますか?アイテムをループ反復するので、その場合はnullptrの値を割り当てることができますか?

EDIT:sは、それがnullになることができますどのように、 "それぞれの" によって得られた場合

if(s) 

: 関心の私のポイントは、このチェックは何のためにあるのかですか?

+0

'v'の型は' std :: vector 'と考えてください。 – GManNickG

+1

これは参照とは全く関係ありません。参照を使用する場合は、それがバインドされている変数を使用するだけで、 "参照変数"は使用しません。このコードでは、 'v'のオブジェクトはboolに変換できます。コードが参照を使用しているという事実は無関係です。 –

+1

'using namespace std;'は良いコードではありません - これはこの例で暗示されています –

答えて

3

以下の定義を仮定します。それと

struct circle { 
    circle(int r) :radius(r) {} 
    int radius; 

    bool operator==(circle rhs) const { 
     return radius == rhs.radius; 
    } 
}; 

std::vector<circle*> load_shapes() { 
    std::vector<circle*> vec; 
    for (int i = 0; i < 10; ++i) 
     vec.push_back(nullptr); 
    return vec; 
} 

、私は今、メイン関数にサンプルコードを挿入することができる:

int main() { 
    using namespace std; 
    auto p = make_shared<circle>(42); 
    auto v = load_shapes(); 
    for(auto& s: v) { 
     if(s && *s == *p) { 
     cout << *s << "is a match\n"; 
     } 
    } 
} 

load_shapesためのその定義と、vを(主に)タイプstd::vector<circle*>であり、それは10個の要素を有し、それらのすべてがヌルポインタです。そのため、forループではscircle*&(円へのポインタへの参照)です。各反復において、それが参照するポインタはヌルポインタです。これがif文がチェックしていることです。

もちろん、他にも定義があります。たとえば、load_shapesはを返すことができます。shapecircleの基本クラスです(これはスライド作成者が念頭に置いたものと思われます)。

関連する問題