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(200ms);
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{ 29d / month(03) / 2022y };
cout << "date1 = " << date1;
auto sysnow = system_clock::now();
cout << format("\nd/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(100ms);
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.


