Инициализатор члена в классе не работает с VS 2013

Я ожидал, что следующий код скомпилируется, но Visual Studio 2013 Update 2 выдает ошибку, тогда как g++ 4.7 компилирует его нормально.

using std::vector;
using std::string;

struct Settings
{
    vector<string> allowable = { "-t", "--type", "-v", "--verbosity" };
};

Компиляция VS 2013 завершается ошибкой:

'std::vector<std::string,std::allocator<_Ty>>::vector' : ни одна перегруженная функция не принимает 4 аргумента

Если я изменю элемент следующим образом, он отлично скомпилируется:

vector<string> allowable = vector<string> { "-t", "--type", "-v", "--verbosity" };

Я просмотрел предложение. ссылка из FAQ Бьярна, и я просмотрел MSDN страница о реализованных функциях C++11 в VS 2013, но я все еще смущен. Должен ли он компилироваться как есть, или я ошибаюсь и должен указывать тип дважды?


person acraig5075    schedule 01.07.2014    source источник
comment
К сожалению, initializer_list ужасно сломан в MSVC 2013, на самом деле многие функции С++ 11 немного зависят от того, работают они или нет :(   -  person Ylisar    schedule 02.07.2014


Ответы (1)


  • Пример, который вы показали, полностью соответствует С++, однако он не работает для VC++ 2013.

  • Это известный Ошибка VC++2013, о которой сообщалось с 31 октября 2013 г., и ее статус все еще активен.

  • Тем не менее, вы можете преодолеть это, выполнив обходной путь. Как предложил @ildjarn, просто поставив дополнительную пару фигурных скобок, вы заставляете initializer_list<> конструктор std::vector вызываться вместо его конструктор заполнения, как в примере ниже:


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

   struct Settings {
     std::vector<std::string> allowable = {{"-t", "--type", "-v", "--verbosity"}};
   };

   int main() {
     Settings s;
     for (auto i : s.allowable) std::cout << i << " ";
     std::cout << std::endl;
   }
person 101010    schedule 01.07.2014
comment
Поскольку конструкторы вызываются так, как если бы вместо фигурных скобок использовались круглые скобки, можно просто использовать второй набор фигурных скобок, чтобы принудительно вызвать конструктор initializer_list<>. Итак, std::vector<std::string> allowable = {{ "-t", "--type", "-v", "--verbosity" }}; — более простой обходной путь. +1 за обнаружение ошибки Connect. - person ildjarn; 02.07.2014
comment
@ildjarn спасибо, чувак, я исправил, твое решение проще, а значит лучше. - person 101010; 02.07.2014