Под современным C++ обычно подразумевают C++11. Вышедшие после него C++14 и C++17 обычно называют минорными обновлениями стандарта. И вот, с появлением C++20, а недавно и C++23 появился современно современный C++. Тавтология по аналогии с long long
.
Так вот, читаю сейчас совсем свежую книгу Beginning C++23 From Beginner to Pro, седьмое издание, авторы Ivor Horton и Peter Van Weert. Книга учит программированию на C++23 и довольно неклассическим образом. Вот самая первая программа из неё:
// Ex1_01.cpp - A complete C++ program
import std; // This line makes the entire Standard Library available,
// including the std::println() functionality used below
int main()
{
int answer {42}; // Defines the variable answer with value 42
std::println("The answer to life, the universe, and everything is {}.", answer);
return 0;
}
Классического Hello World нет, но его написание предлагается в качестве домашнего задания и тут же намекают каков должен быть код:
exercise 1-1. Create, compile, link, and execute a program that will display the text «Hello World» on your screen.
exercise 1-2. Create and execute a program that outputs your name on one line and your age on the next line. define a variable to hold your age first.
exercise 1-3. the following program produces several compiler errors. Find and correct these errors so the program compiles cleanly.
#import std
Int main
{
std:printn("Holla Mundo!")
)
Так же в первых главах авторы написали:
As of C++23, the preferred mechanism for outputting text to the computer’s screen is through functions such as std::println()
and std::print()
. We will use these in nearly every example in this book.
Короче C++23 начинает напоминать Java. Но эту тему я открыл не поэтому. Мне вот стало интересно, а как воспримут обучившегося по такой книге джуна или мидла матёрые си плюс плюснутые дядьки из реальных проектов? Вот придёт такой свежеобученный программист в реальный проект и начнёт проталкивать C++ модули везде и всюду. Что скажут старшие товарищи? Побьют или они уже и сами перешли на модули и пишут свой код так, как описано в этой книге?
Не поймите меня неправильно, в книге рассказывают и о классических стримах ввода/вывода, но даже там говорят, что std::print()
и std::println()
предпочтительнее:
Streams
Input and output in C++ are, as a rule, performed using streams. To output data, you write it to an output stream, and to input data, you read it from an input stream. A stream is an abstract representation of a source of data or a data sink. When your program executes, each stream is tied to a specific device that is the source of data in the case of an input stream and the destination for data in the case of an output stream. The advantage of having an abstract representation of a source or sink for data is that the programming is then the same regardless of the device the stream represents. You can read a disk file in essentially the same way as you read from the keyboard.
std::print()
and std::println()
are little more than thin layers on top of streams. In essence, the std::println()
statement in the main() function of Ex1_01 is analogous to either one of these statements:
std::cout << std::format("The answer to life, the universe, and everything is {}.", answer) << std::endl;
std::cout << "The answer to life, the universe, and everything is " << answer << std::endl;
The standard output and input streams in C++ are called std::cout
and std::cin
, respectively, and by default, they correspond to your computer’s screen and keyboard. You’ll be reading input from std::cin
in Chapter 2 and later chapters.
std::format()
is similar to std::print()
, except that instead of streaming directly to the standard output stream, std::format()
returns the formatted character sequence encapsulated in a std::string
object (see Chapter 7). This is why std::print()
is effectively analogous to streaming the result of std::format()
to std::cout
, as we did in the first line of our example.
<<
, finally, is the stream insertion operator that transfers data to a stream. In Chapter 2, you’ll meet the stream extraction operator, >>, which similarly reads data from a stream. Whatever appears to the right of each <<
is transferred to std::cout
. You can insert as many strings or other values in one statement as you want (we’ll clarify how this works exactly in Chapter 13). Inserting std::endl
to std::cout
causes a new line to be written to the stream and the output buffer to be flushed. Flushing the output buffer ensures that the output appears immediately.
Compared to working directly with std::cout
, working with std::print()
and std::println()
is generally both more elegant and efficient (see the next chapter for more convincing evidence). This is why we won’t use output streams that often anymore as of this edition of the book. But because output streams remain an important concept in C++ in general, we’ll briefly return to working with streams at the end of the next chapter to introduce the basic principles.
Разумеется, большинство настоящих проектов на C++ заняты вовсе не вводом/выводом в консоль. Но переход на модули наверняка меняет устоявшиеся привычки в программировании на C++ ещё во множестве других мест. Мне интересно, как это будет воспринято синьёрами помидорами? Помню как я сам начинал программировать на Java в 2006 году. Во время обучения я использовал Java 6, в которой был новый синтаксис цикла for
. На собеседовании у меня был лайв кодинг и когда я начал писать такой цикл и написал двоеточие интервьюирующий меня груплид воскликнул: «это же не Pascal!» В тогдашнем проекте той конторы использовали Java 5, в которой for-each только появился.