Подтвердить что ты не робот

Вопросы о инициализаторах нестатических данных

Я построил MinGW из магистральной версии GCC-4.7.0: http://code.google.com/p/mingw-builds/downloads/list

В описании изменений этой версии сказано, что инициализаторы элементов нестатического ввода данных реализованы: http://gcc.gnu.org/gcc-4.7/changes.html

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

Когда я пытаюсь скомпилировать такой пример:

#include <iostream>
#include <string>

struct type {
   type()
      :i(33)
   {}

   int i;
   std::string s("string");
};

int main() {
   type t;
   std::cout << t.i << " : " << t.s << std::endl;
}

Я получаю массу ошибок, и это в конце:

main.cpp: 16: 35: note: 'std::string (type::) (int) {aka std:: basic_string (type::) (int)} 'не выводится из' const std:: basic_string < _CharT, _Traits, _Alloc > 'main.cpp: 16: 35: note: не удалось разрешить адрес из перегруженной функции 't.type:: s'

Но в соответствии с документацией код правильный.

4b9b3361

Ответ 1

Проблема заключается в двусмысленности в определении того, объявляете ли вы функцию или объект, а компилятор выбирает функцию.

Вместо этого попробуйте инициализировать строку, используя этот синтаксис:

std::string s = "string";

Если мы перейдем к ссылке из примечаний к выпуску GCC относительно инициализаторов нестатических данных (предложение N2756), они упоминают это в проблеме 1, с этим примечанием к резолюции:

У CWG был опрос соломы от 6 до 3 в Kona в пользу поиска класса; и это то, что предлагает этот документ, с инициализаторами для нестатического члены данных, ограниченные "= инициализатор-предложение" и "{ initializer-list}".

Ответ 2

Элемент данных должен быть инициализирован с помощью инициализаторов в виде скобок или равных. Посетите http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

8.5 Инициализаторы [dcl.init]

Измените грамматику для инициализатора:

инициализатор:

= (  expression-list  )

скобка или равно-инициализатор:

=  initializer-clause

   braced-init-list