In addition to the major additions to Reflections and Contracts that I’ve introduced over the past few weeks, there are also some smaller, useful additions to C++26.
Advertisement
Rainer Grimm has been working as a software architect, team and training manager for many years. He enjoys writing articles on the programming languages C++, Python, and Haskell, but also frequently speaks at expert conferences. On his blog Modern C++ he discusses his passion C++ in depth.
placeholder
Structured binding is a feature of C++17 that allows you to bind multiple variables to elements of a structured object.
The following program demonstrates the use of tuples and structured binding to open and return multiple values from a function.
// placeholder1.cpp
#include
#include
#include
// Function that returns three values
std::tuple getThreeValues() {
int intValue = 42;
std::string strValue = "example";
double doubleValue = 3.14;
return std::make_tuple(intValue, strValue, doubleValue);
}
int main() {
// Retrieve the three values using structured binding
auto (intValue, strValue, doubleValue) = getThreeValues();
// Print the values
std::cout << "Integer: " << intValue << '\n';
std::cout << "String: " << strValue << '\n';
std::cout << "Double: " << doubleValue << '\n';
}
Celebration getThreeValues
Defined to return a tuple containing three different data types: a int
A std::string
and one double
Then these values are included std::make_tuple
Packed into a tuple and returned by the function.
In main
function, program calls all three getThreeValues
Values returned using structured binding. Structured binding allows programs to pack tuples directly into three different variables: intValue
, strValue
And doubleValue
This makes the code more readable and simpler than manually unpacking the tuple.
Sometimes you don’t need all three values from a function getThreeValues
,
// placeholder2.cpp
#include
#include
#include
// Function that returns three values
std::tuple getThreeValues() {
int intValue = 42;
std::string strValue = "example";
double doubleValue = 3.14;
return std::make_tuple(intValue, strValue, doubleValue);
}
int main() {
// Retrieve the three values using structured binding
auto (_, strValue, doubleValue) = getThreeValues();
// Print the values
std::cout << "String: " << strValue << '\n';
std::cout << "Double: " << doubleValue << '\n';
}
this time it will happen intValue
from the ceremony getThreeValues
This is not needed in the following code. By convention I bind it with an underscore.
This also means that the compiler does not issue any warnings due to the variable. _
is not used:
Unfortunately, this may be counter-intuitive _
Can be used only once as an identifier. This restriction no longer applies to C++26:
// placeholder3.cpp
#include
#include
#include
// Function that returns three values
std::tuple getThreeValues() {
int intValue = 42;
std::string strValue = "example";
double doubleValue = 3.14;
return std::make_tuple(intValue, strValue, doubleValue);
}
int main() {
// Retrieve the three values using structured binding
auto (_, strValue, _) = getThreeValues();
// Print the values
std::cout << "String: " << strValue << '\n';
}
In this version neither intValue
nor that doubleValue
from the ceremony getThreeValues
Needed. I use two consecutive underscores.
extended character set
three new characters have arrived basic character set Available:
The following program uses all three for raw string literals.
#include
int main() {
std::cout << '\n';
auto raw1 = R"@(Hello\n)@";
auto raw2 = R"$(Hello\t)$";
auto raw3 = R"`(Hello\b)`";
std::cout << "raw1: " << raw1 << '\n';
std::cout << "raw2: " << raw2 << '\n';
std::cout << "raw3: " << raw3 << '\n';
std::cout << '\n';
}
The program then defines three raw string literals: raw1
, raw2
And raw3
Raw string literals are used in C++ delimiter(...)delimiter
included, where delimiter
The characters can be in any order. So the string can contain special characters like \n
, \t
Or \b
Included without explanation.
raw1
is defined asR„@(Hello\n)@
“, that’s the textHello\n
without him included\n
This is interpreted as a line breakraw2
is defined asR„$(Hello\t)$“
that lessonHello\t
including, without\t
will be interpreted as a tab characterraw3
is defined asR„`(Hello\b)`“
that lessonHello\b
without him included\b
Interpreted as backspace.
Finally we see the output of the program:
What will happen next?
The core C++26 language pack provides further improvements such as indexing. I will write about it in the next blog article.
(rme)