8

最近書いているコードで、奇妙な動作に気付きました。

make_pair最初の引数を で使用すると、名前空間で「魔法のように」使用可能std::pairになります (修飾子make_pairを使用する必要はありません)std::

#include <iostream>

int main()
{   
    int i1 = 2; int i2 = 10; int i3 = 0;

    // constructing a pair using std::make_pair, everything's okay
    std::pair<int,int> key = std::make_pair(i1, i2);

    // here, why is make_pair suddenly magically available without the
    // std:: namespace qualifier?
    // At the same time, using ::make_pair yields and error
    // (make_pair has not declared...)
    std::pair<std::pair<int,int>, int> mypair = make_pair(key, i3);

    std::cout << mypair.first.first << "\n";
    std::cout << mypair.first.second << "\n";
    std::cout << mypair.second << "\n";

    return 0;
}

は問題なくコンパイルされ(を使用-Wall and -pedantic-errors)、次のように出力されます。

2
10
0

なぜこうなった?私は cppreference を調べましたが、この動作が正しいというヒントは見つかりませんでした。何か不足していますか?

参考までに、gcc 4.6.3 を使用しています

4

1 に答える 1