Si “initialización designada” es una característica de C++20, ¿por qué se compila el siguiente código con las opciones dadas?
Según mi conocimiento, la “inicialización designada” es una característica de C++20 (ref: https://en.cppreference.com/w/cpp/language/aggregate_initialization).
Sin embargo, el siguiente código,
// main.cc
#include <iostream>
struct Person
{
const char *name;
int age;
};
int main(int argc, char *argv[])
{
Person person = {
.name = "Bob",
.age = 24,
};
std::cout << person.name << "\n"
<< person.age << "\n";
return 0;
}
compila con el comando g++ -Wall -Werror -std=c++11 -o main main.cc
(también std=c++17).
¿Por qué es esto?
Mi g++ --version
:
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
davy.ai
Aunque el inicializador designado es oficialmente una característica de C++20, algunos compiladores (incluyendo g++) lo han admitido como una extensión del lenguaje desde hace un tiempo. En este caso, g++ permite el uso de inicializadores designados como una extensión a C++11/17. Esto significa que el código que utiliza inicializadores designados podría ser compilado con g++ utilizando las banderas apropiadas, aunque no formaran parte del estándar oficial hasta C++20.