С++ 11 ошибка initializer_list

Рассмотрим код:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> v{{"awe", "kjh"}}; // not v{"awe", "kjh"}

    std::cout << v.size() << std::endl;

    return 0;
}
  1. Является ли этот код ошибочным? Или, может быть, допустимо использовать двойное {} при инициализации вектора?

  2. Я пробовал этот код на gcc и MSVC. MSVC 2012 + complier Nov 2012 просто не может его скомпилировать, что неудивительно. Этот код, скомпилированный с помощью gcc 4.7 или 4.8, дает ошибку выполнения во время выполнения программы. Правильно ли это поведение?

К сожалению, не могу протестировать его с другими компиляторами.


person inkooboo    schedule 10.06.2013    source источник
comment
это может быть полезно - stackoverflow.com/questions/11400090/   -  person Bill    schedule 10.06.2013
comment
см. stackoverflow.com/questions/14587436/ и cplusplus.github.io/LWG/lwg-active.html#2238 (они касаются чего-то другого, но очень похожего).   -  person Johannes Schaub - litb    schedule 11.06.2013


Ответы (2)


Обратите внимание, что ваша инициализация эквивалентна:

std::vector<std::string> v{std::string{"awe", "kjh"}}; 
// not: std::vector<std::string> v{std::string{"awe"}, std::string{"kjh"}};

Стандарт не требует такого конструктора реализаций типа std::string, поэтому, исходя из конкретной реализации STD, я предполагаю, что код может делать разные вещи.

С уважением, &rzej

person Andrzej    schedule 10.06.2013

Внутренний {} обрабатывается конструктором std::string. Это не удастся во время выполнения, если вы просто сделаете

std::string> s{"awe", "kjh"};
person doctorlove    schedule 10.06.2013