brace initializer list

0

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

#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:

struct X
{
    X(std::initializer_list<int> x){};
    int a;
    int b;
    int c;
};
3

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

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

A to się wywala:

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

Z błędem:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1