Show Lecture.SymbolAmbiguity as a slide show.
or
“Them there namespacies is trickier then I done thought!”
__cplusplus
symbol% cp ~/Example/version.cc . % cat version.cc #include <iostream> int main() { std::cout << __cplusplus << '\n'; } % g++ -std=c++98 version.cc && ./a.out 199711 % g++ -std=c++11 version.cc && ./a.out 201103
__cplusplus
, an int
, is the YYYYMM of the C++ standard in use.
using namespace
, C++ 98#include <iostream> #include <string> #include <utility> using namespace std; void move(string s) { cout << "moving " << s << '\n'; } int main() { cout << __cplusplus << '\n'; move("umbrella"); }
199711 moving umbrella
move
wants std::string
; we gave it const char *
.
using namespace
, C++ 11#include <iostream> #include <string> #include <utility> using namespace std; void move(string s) { cout << "moving " << s << '\n'; } int main() { cout << __cplusplus << '\n'; move("umbrella"); }
201103
-std=c++98
to -std=c++11
.
using namespace
, C++ 11#include <iostream> #include <string> #include <utility> using namespace std; void move(string s) { cout << "moving " << s << '\n'; } int main() { cout << __cplusplus << '\n'; move("umbrella"); }
201103
std::move
is a better match for "umbrella"
.
std::
, C++ 98#include <iostream> #include <string> #include <utility> void move(std::string s) { std::cout << "moving " << s << '\n'; } int main() { std::cout << __cplusplus << '\n'; move("umbrella"); }
199711 moving umbrella
using namespace
, and sprinkle their code with std::
.
std::
, C++ 11#include <iostream> #include <string> #include <utility> void move(std::string s) { std::cout << "moving " << s << '\n'; } int main() { std::cout << __cplusplus << '\n'; move("umbrella"); }
201103 moving umbrella
using
, C++ 98#include <iostream> #include <string> #include <utility> using std::string; using std::cout; void move(string s) { cout << "moving " << s << '\n'; } int main() { cout << __cplusplus << '\n'; move("umbrella"); }
199711 moving umbrella
using
declarations.
using
, C++ 11#include <iostream> #include <string> #include <utility> using std::string; using std::cout; void move(string s) { cout << "moving " << s << '\n'; } int main() { cout << __cplusplus << '\n'; move("umbrella"); }
201103 moving umbrella
Do you carry an umbrella every day, or only when the weather report predicts rain?
If you carry an umbrella every day, then you’re always dry, but you have the bother of carrying an umbrella all the time.
If you only carry it when rain is predicted, then you’ll get wet once in a while. However, you don’t have to lug around an umbrella when you don’t need it.
It’s a trade-off. Which price do you want to pay? Constant carrying, or occasional moisture?
Similarly …
using
at all, you pay the price of your code
being littered with std::
prefixes.
std::cout << x << std::endl;
using
declarations, you have to keep adding
them as you change your code. They’re all at the top of the file,
so they don’t get in the way of reading the real code.
#include <iostream> using std::cin; using std::cout; using std::getline;
using namespace std
, you’ll have a rare nasty problem.
using namespace std;
Your choice! My opinions:
std::cout << x << std::endl
makes the code difficult
to read. It’s hard to get past the litter of std::
to see the real code. Perhaps you get used to it.
using std::cin
,
and he’s one of the two finest C++ programmers in the CS Department,
so there’s a lot to be said for that.
using namespace std
.
I haven’t had a problem … yet.