brace initializer list

brace initializer list
FV
  • Rejestracja:około 6 lat
  • Ostatnio:3 miesiące
  • Postów:96
0

Hej czy ktoś wie czemu std::string da się zainicjalizować brace initializer listą jak to nie jest POD:

Kopiuj
#include <iostream>

struct X
{
    X(){};
    int a;
    double b;
    int c;
};

int main()
{
    std::cout << "C++17" << std::endl;
    //std::string x = {"sasasa"}; //to się da a przecież string też nie jest podem
    X x = {1,2,3}; //tego sie nie da bo to nie POD bo dałem user declared ctor
    //X x[2] = {{1,2.0,3}, {4,5.0,6}}; //tego sie nie da bo to nie POD bo dałem user declared ctor
    std::cout << sizeof(X) << std::endl;

    return 0;
}

Może w implementacji stringa dali kontruktor implicit a na liście argumentów ctora initializer list i stąd działa, ale jakby tego nie bylo to by też wystąpił błąd kompilacji? Jak dam tak to już działa:

Kopiuj
struct X
{
    X(std::initializer_list<int> x){};
    int a;
    int b;
    int c;
};
edytowany 3x, ostatnio: cerrato
RE
ogólnie polecam ci lekturę efficent c++ tam jest osobny rozdział na {} i initializer list. Generalnie w c++11 bajzel trochę powstał(który maił ogarnąć bajzel pre c++11) w c++14 i c++17 poprawili trochę temat.
Spearhead
Chyba Effective Modern C++ a nie Efficient (jakiś staroć)
RE
a fakt przejęzyczanie, książka meyersa.
Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 12 godzin
  • Postów:1002
3

Tak, std::string ma konstruktor przyjmujący listy inicjalizacyjne (patrz tu). Tyle że przyjmują chary. Dlatego to działa:

Kopiuj
std::string s = {'a', 'b', 'c'};

A to się wywala:

Kopiuj
std::string s = {"abc", "def"};

Z błędem:

Kopiuj
terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_M_create
Aborted (core dumped)

Nie wiem, dlaczego std::string s = {"abc"} działa, ale pewnie zachodzą jakieś konwersje.

EDIT Google podsuwa to: https://stackoverflow.com/questions/33298375/why-stdstringconst-char-ptr-works

edytowany 3x, ostatnio: Spearhead

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.