I. Nouveautés C++ Builder 13▲
Je vous propose aujourd'hui à l'occasion de la sortie de C++ Builder 13 Florence (sorti le 10 septembre 2025) de faire un point sur les principales nouveautés.
Vous pouvez regarder le replay de la présentation de lancement de RadStudio ICI ou la rubrique "What's New" de la documentation ICI pour plus de détails
I-A. MAJ du compilateur C++ Moderne▲
Il y a maintenant 4 compilateurs C++ Windows.
- Compilateur classique « Borland » 32 bits
- Compilateur Clang 5.0 32 bits
- Compilateur Clang 5.0 64 bits
- Compilateur Moderne Clang 20 64 bits
Le compilateur moderne est passé de Clang 15 à Clang 20
Le support de C++20 et C++23 est presque complet. (Cf. doc statut compilateur & LLVM lib C++ ICI ) alors que la version précédente du compilateur ne supportait que C++17
I-A-1. Principales nouveautés C++ 20▲
Je vous propose un petit résumé des principales nouveautés de C++ 20 ainsi qu'un petit exemple de programme les mettant en œuvre pour les illustrer
- Opérateur <=> et évolutions comparaisons
- Librairie format
- Librairie range
- SPAN
- Source_location
- Librairie chrono : Gestion calendrier
- Jthread
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
#include
<format>
#include
<ranges>
#include
<chrono>
#include
<source_location>
#include
<thread>
using
namespace
std;
using
namespace
std::
chrono;
struct
Point2D {
int
x;
int
y;
Point2D(int
x_, int
y_) :x(x_), y(y_) {}
;
std::
strong_ordering operator
<=>
(const
Point2D&
OpDroite) const
{
if
(auto
r =
x <=>
OpDroite.x; r !=
0
)
return
r;
return
y <=>
OpDroite.y;
}
bool
operator
==
(const
Point2D&
OpDroite) const
{
return
(x ==
OpDroite.x) &&
(y ==
OpDroite.y);
}
}
;
template
<>
struct
std::
formatter<
Point2D>
{
constexpr
auto
parse(std::
format_parse_context&
ctx) {
return
ctx.begin();
}
auto
format(const
Point2D&
p, std::
format_context&
ctx) const
{
return
std::
format_to(ctx.out(), "({};{})"
, p.x, p.y);
}
}
;
void
FctBasic(int
no)
{
cout <<
"Debut thread "
<<
no <<
endl;
for
(int
i =
0
; i <
3
; i++
) {
this_thread::
sleep_for(200
ms);
cout <<
"Thread "
<<
no <<
" iteration "
<<
i <<
endl;
}
cout <<
"Fin thread "
<<
no <<
endl;
}
int
_tmain(int
argc, _TCHAR*
argv[])
{
// Format
cout <<
"Hello "
<<
format("the answer is {}."
, 42
) <<
endl;
// <=> Operator
Point2D A{
1
,1
}
;
Point2D B{
1
,2
}
;
cout <<
format("A < B = {}<{} = {}"
, A, B, (A <
B)) <<
endl;
cout <<
format("A > B = {}>{} = {}"
, A, B, (A >
B)) <<
endl;
cout <<
"Ranges "
<<
endl;
vector<
int
>
myVec{
0
, 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
}
;
auto
vue =
myVec |
views::
reverse |
views::
take(5
);
for
(auto
v : vue) {
std::
cout <<
v <<
" "
;
}
cout <<
endl;
cout <<
"Chrono "
<<
endl;
auto
date1{
29
d /
month(03
) /
2022
y }
;
cout <<
"date1 = "
<<
date1;
auto
sysnow =
system_clock::
now();
cout <<
format("
\n
d/m/Y H:M:S ={:%d/%m/%Y %H:%M:%S}
\n
"
, sysnow);
auto
location =
source_location::
current();
cout <<
format("source_location
\n
{} ({}:{})
\"
{}
\"
\n
"
, location.file_name(), location.line(), location.column()
, location.function_name());
cout <<
"JThread "
<<
endl;
{
jthread t1(FctBasic, 1
);
this_thread::
sleep_for(100
ms);
jthread t2(FctBasic, 2
);
}
cout <<
"Fin JThread "
<<
endl;
getchar();
}
Résultat exécution :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Hello the answer is 42.
A < B = (1;1)<(1;2) = true
A > B = (1;1)>(1;2) = false
Ranges
9 8 7 6 5
Chrono
date1 = 2022-03-29
d/m/Y H:M:S =27/09/2025 09:35:06.245386
source_location
DemoCpp20_1_Main.cpp (70:19) "int wmain(int, _TCHAR **)"
JThread
Debut thread 1
Debut thread 2
Thread 1 iteration 0
Thread 2 iteration 0
Thread 1 iteration 1
Thread 2 iteration 1
Thread 1 iteration 2
Fin thread 1
Thread 2 iteration 2
Fin thread 2
Fin JThread
I-A-2. Principales nouveautés C++ 23▲
Petit résumé de quelques nouveautés C++23 qui sont implémentées dans Clang 20
- Opérateur [] multidimensionnel
- Mdspan (Span multidimensionnel)
- Evolution Format : support des conteneurs
- println
- Gestion des erreurs par Expected
- Monadic optional & expected
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include
<iostream>
#include
<tchar.h>
#include
<array>
#include
<mdspan>
#include
<format>
#include
<expected>
#include
<charconv>
using
namespace
std;
expected<
int
, string>
parse_int(const
string&
s) {
int
value{}
;
auto
[ptr, ec] =
from_chars(s.data(), s.data() +
s.size(), value);
if
(ec ==
errc{}
) {
return
value;
}
else
{
return
unexpected("Error: unable to convert
\"
"
+
s +
"
\"
to int"
);
}
}
int
_tmain(int
argc, _TCHAR*
argv[])
{
cout <<
"multidimensional operator[] and mdspan"
<<
endl;
array A{
1
, 2
, 3
,4
, 5
, 6
}
;
mdspan Span{
A.data(), 2
, 3
}
;
for
(size_t i =
0
; i <
Span.extent(0
); ++
i)
for
(size_t j =
0
; j <
Span.extent(1
); ++
j)
cout <<
format("Span[{},{}]={}
\n
"
, i, j, Span[i, j]);
println("println of array A={}"
, A);
cout <<
"std::expected & monadic"
<<
endl;
for
(auto
test : {
"42"
s, "abc"
s }
) {
auto
result =
parse_int(test);
if
(result)
cout <<
"Pass: value = "
<<
*
result <<
"
\n
"
;
else
cout <<
"Fail: "
<<
result.error() <<
"
\n
"
;
cout <<
"value_or(0): "
<<
result
.and_then([](int
x)->
expected<
int
, string>
{
return
x *
5
; }
)
.value_or(0
) <<
"
\n
"
;
}
getchar();
}
Résultat exécution :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
multidimensional operator[] and mdspan
Span[0,0]=1
Span[0,1]=2
Span[0,2]=3
Span[1,0]=4
Span[1,1]=5
Span[1,2]=6
println of array A=[1, 2, 3, 4, 5, 6]
std::expected & monadic
Pass: value = 42
value_or(0): 210
Fail: Error: unable to convert "abc" to int
value_or(0): 0
I-B. Autres nouveautés▲
II. Récapitulatif des nouveautés 12 à 12.3▲
Cette présentation des nouveautés de C++ Builder 12.3
Cliquez pour lire la vidéo
aborde :
- Résumé des nouveautés de C++ Builder 12 à 12.3
- Clang ASAN
- Le time travel debugging
- Dr Memory
III. Découverte du Time Travel debugging▲
Dans la vidéo ci-dessus à 9:10 vous trouverez une démonstration de l'utilisation du Time Travel debugging.
Cette possibilité est apparue depuis que les fichiers de debug sont au format PDB.
Cette démonstration n'est pas spécifique à C++ Builder, vous pouvez faire la même chose avec toutes les chaines de compilation qui produisent des fichiers PDB, à commencer bien sûr par C++ dans Visual Studio.