名前空間 解答ページ | Programming Place Plus Modern C++編【言語解説】 第4章

トップページModern C++編 C++編](../../index.html) – 第4章

Modern C++編は作りかけで、更新が停止しています。代わりに、C++14 をベースにして、その他の方針についても見直しを行った、新C++編を作成しています。
Modern C++編は削除される予定です。

問題①

問題① 次のプログラムの出力結果を答えてください。

#include <iostream>

void func()
{
    std::cout << "::func()" << std::endl;
}

namespace util {
    void func()
    {
        std::cout << "util::func()" << std::endl;
    }
}

int main()
{
    using util::func;

    func();
}


using宣言によって、util::func は main関数のスコープ内に func という名前で追加されます。結果、main関数内には、ローカルな func が存在することになります。

main関数内での func関数という呼び出しは、同じスコープ内にある func が選ばれますから、util::func関数の方が呼び出されます。このプログラムの場合、グローバル名前空間の func関数と同じ名前であることは問題ではなく、単に、より近いスコープのものが選択されるということです。

実行結果:

util::func()


問題②

問題② 問題①のプログラムで、main関数の内側にある using宣言を、

using namespace util;

に変更した場合、実行結果はどうなりますか?


usingディレクティブの場合、指定した名前空間名を修飾無しで使えるようになります。 結果、

のいずれもが、「func();」で呼び出せることになります。

問題①とは違って(using宣言とは違って)、util::func は util名前空間内にしかありません。つまり、名前空間が異なる2つの func が存在している状態です。しかもいずれも、main関数のスコープではないため、main関数内での「func()」という呼び出しは、どちらがより近いスコープであるとも言えず、判断ができないため、コンパイルは失敗します。

もし、グローバル名前空間の func関数を呼びたかったのなら、

::func();

と書く必要がありますし、util::func関数を呼びたかったのなら、

util::func();

と書かなければなりません。



参考リンク


更新履歴

’2017/7/8 新規作成。



第4章のメインページへ

Modern C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る