Share
Embed
Transcript
42 slides
-
using ディレクティブの使い方 #include <iostream> namespace N { void hell() {
std::cout << "Hell, World!" << std::endl; } } int main() { N::hell(); } 6 -
using ディレクティブの使い方 #include <iostream> namespace N { void hell() {
std::cout << "Hell, World!" << std::endl; } } int main() { N::hell(); } std::が鬱陶しい! ※ いや、個人的には std::endl は基本使わないんですが、気にしない方向で… 7 -
using ディレクティブの使い方 #include <iostream> using namespace std; namespace N {
void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } スッキリした! 素晴らしい! 10 using ディレクティブ入れてみた -
余談:using 何て? いつもの C++ の予約語使いまわし芸のせい で、予約語 using を使った構文は他にもいっ ぱいあるので、ご注意を! using-declaration
using-enum-declaration※ alias-declaration attribute-using-prefix ※ NEW!!! C++20!!! 11 -
using ディレクティブの使い方 #include <iostream> namespace N { using namespace std;
void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } 15 名前空間Nに using ディレクティブ入れてみた -
名前空間Nに using ディレクティブ入れてみた using ディレクティブの使い方 #include <iostream> namespace N {
using namespace std; void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } これならNの外には影響なし! 素晴らしい! 16 -
using ディレクティブのワナ #include <iostream> namespace N { using namespace std;
auto cout = 42; void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } 18 ちょっと名前が被っただけで… ※ そんな変な名前使わねぇよ、と言うツッコミは無しの方向で… (実際std名前空間にはめっさ名前があるから許して…) -
using ディレクティブのワナ #include <iostream> namespace N { using namespace std;
auto cout = 42; void hell() { cout << "Hell, World!" << endl; } } int main() { N::hell(); } 19 コンパイルエラー! そりゃそうだ… ※ そんな変な名前使わねぇよ、と言うツッコミは無しの方向で… (実際std名前空間にはめっさ名前があるから許して…) ちょっと名前が被っただけで… -
using ディレクティブのワナ #include <iostream> namespace N { auto cout =
42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 20 using ディレクティブは名前空間スコー プだけじゃなくて、ローカルスコープ でも使えます!!!1! -
using ディレクティブのワナ #include <iostream> namespace N { auto cout =
42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 21 using ディレクティブは名前空間スコー プだけじゃなくて、ローカルスコープ でも使えます!!!1! やっぱり コンパイルエラー! -
using ディレクティブは名前空間スコー プだけじゃなくて、ローカルスコープ でも使えます!!!1! using ディレクティブのワナ #include <iostream> namespace N
{ auto cout = 42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 22 やっぱり コンパイルエラー! 何で!? -
using ディレクティブのワナ #include <iostream> namespace N { auto cout =
42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 24 自分で定義したcoutは 名前空間スコープにある… -
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で使えるんじゃ… -
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で使えるんじゃ… ナゾ! -
using ディレクティブのワナ 困ったら エゾえもんに 相談だ! 27 助 け て エ
ゾ え も ~ ん ! -
using ディレクティブのワナ 困ったら エゾえもんに 相談だ! 28 質 問 で は
な い 助 け て エ ゾ え も ~ ん ! -
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 -
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 英語 読めん! -
using ディレクティブのワナ #include <iostream> namespace N { auto cout =
42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 35 このusingディレクティブを囲む 名前空間はN。 -
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。 -
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。 -
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にある。 -
using ディレクティブのワナ #include <iostream> namespace N { auto cout =
42; void hell() { using namespace std; cout << "Hell, World!" << endl; } } int main() { N::hell(); } 39 この場合 std::coutは 単純名では 見えない!!! -
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 は "ほげ" じゃなくて "はげ"!