Upgrade to Pro — share decks privately, control downloads, hide ads and more …

みんな大好き!using ディレクティブ! / using directive

みんな大好き!using ディレクティブ! / using directive

C++MIX #7 の発表資料です。

Miutsuru kariya

January 29, 2020
Tweet

More Decks by Miutsuru kariya

Other Decks in Programming

Transcript

  1. using ディレクティブの使い方 #include <iostream> namespace N { void hell() {

    std::cout << "Hell, World!" << std::endl; } } int main() { N::hell(); } 6
  2. using ディレクティブの使い方 #include <iostream> namespace N { void hell() {

    std::cout << "Hell, World!" << std::endl; } } int main() { N::hell(); } std::が鬱陶しい! ※ いや、個人的には std::endl は基本使わないんですが、気にしない方向で… 7
  3. using ディレクティブの使い方 #include <iostream> using namespace std; namespace N {

    void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } スッキリした! 素晴らしい! 10 using ディレクティブ入れてみた
  4. using ディレクティブの使い方 #include <iostream> namespace N { using namespace std;

    void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } 15 名前空間Nに using ディレクティブ入れてみた
  5. 名前空間Nに using ディレクティブ入れてみた using ディレクティブの使い方 #include <iostream> namespace N {

    using namespace std; void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } これならNの外には影響なし! 素晴らしい! 16
  6. using ディレクティブのワナ #include <iostream> namespace N { using namespace std;

    auto cout = 42; void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } 18 ちょっと名前が被っただけで… ※ そんな変な名前使わねぇよ、と言うツッコミは無しの方向で… (実際std名前空間にはめっさ名前があるから許して…)
  7. using ディレクティブのワナ #include <iostream> namespace N { using namespace std;

    auto cout = 42; void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } 19 コンパイルエラー! そりゃそうだ… ※ そんな変な名前使わねぇよ、と言うツッコミは無しの方向で… (実際std名前空間にはめっさ名前があるから許して…) ちょっと名前が被っただけで…
  8. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 20 using ディレクティブは名前空間スコー プだけじゃなくて、ローカルスコープ でも使えます!!!1!
  9. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 21 using ディレクティブは名前空間スコー プだけじゃなくて、ローカルスコープ でも使えます!!!1! やっぱり コンパイルエラー!
  10. using ディレクティブは名前空間スコー プだけじゃなくて、ローカルスコープ でも使えます!!!1! using ディレクティブのワナ #include <iostream> namespace N

    { auto cout = 42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 22 やっぱり コンパイルエラー! 何で!?
  11. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 24 自分で定義したcoutは 名前空間スコープにある…
  12. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 25 自分で定義したcoutは 名前空間スコープにある… std::coutは当然std名前空間にあるけど、 usingディレクティブでローカルスコープに 持ってきたんだから、名前空間Nよりも内側 にあるのでcoutで使えるんじゃ…
  13. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 26 自分で定義したcoutは 名前空間スコープにある… std::coutは当然std名前空間にあるけど、 usingディレクティブでローカルスコープに 持ってきたんだから、名前空間Nよりも内側 にあるのでcoutで使えるんじゃ… ナゾ!
  14. using ディレクティブのワナ 9.8.3 Using namespace directive [namespace.udir] 2. During unqualified

    name lookup, the names appear as if they were declared in the nearest enclosing namespace which contains both the using- directive and the nominated namespace. http://eel.is/c++draft/namespace.udir#2 30
  15. using ディレクティブのワナ 9.8.3 Using namespace directive [namespace.udir] 2. During unqualified

    name lookup, the names appear as if they were declared in the nearest enclosing namespace which contains both the using- directive and the nominated namespace. http://eel.is/c++draft/namespace.udir#2 31 英語 読めん!
  16. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 35 このusingディレクティブを囲む 名前空間はN。
  17. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 36 このusingディレクティブを囲む 名前空間はN。 このusingディレクティブで指定 された名前空間はstd。
  18. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 37 Nとstdの両方を囲む最も近い名前 空間は、グローバル名前空間。 このusingディレクティブを囲む 名前空間はN。 このusingディレクティブで指定 された名前空間はstd。
  19. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 38 つまり、std::coutはグローバル 名前空間にあるように見える。 一方、自分で定義したcout変数は 名前空間Nにある。
  20. using ディレクティブのワナ #include <iostream> namespace N { auto cout =

    42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 39 この場合 std::coutは 単純名では 見えない!!!
  21. using ディレクティブのワナ #include <iostream> namespace A { auto s =

    "ほげ"; } namespace B { auto s = "はげ"; void f() { using namespace A; std::cout << s << std::endl; } } int main() { B::f(); } 40 この s は "ほげ" じゃなくて "はげ"!