Инициализировать массив char в списке инициализации конструктора в C++

Это нормально использовать инициализацию, как это?

class Foo
{
public:
   Foo() : str("str") {}
   char str[4];
};

И это?

int main()
{
   char str[4]("str");
}

Оба дают мне ошибку в GCC 4.7.2:

ошибка: массив используется как инициализатор

Comeau компилирует оба.

3 ответа

В C++03 массив нестатических элементов не может быть инициализирован, как вы упомянули. В g++ может быть расширение списка инициализаторов, но это особенность C++11.

Локальная переменная в функции может быть инициализирована следующим образом:

char str[] = "str"; // (1)
char str[] = {'s','t','r',0}; // (2)

Хотя вы можете упомянуть размер как 4, но лучше не упоминать, чтобы избежать случайного массива за пределами.

Я бы порекомендовал использовать std::string в обоих случаях.

Этот код является допустимым C++03 и gcc здесь просто не соответствует.

Язык, который допускает этот синтаксис для инициализации символьных массивов, такой же, как и для любого другого типа; нет исключений, которые бы запрещали его использование в массивах символов. () а также = инициализация в этих случаях эквивалентна, и массив символов следует просто инициализировать в соответствии с 8.5.2.

Вот подтвержденный отчет об ошибке gcc, который покрывает это.

В C++03 это невозможно. Comeau может скомпилировать его из-за нестандартного расширения.

В C++11 вы можете сделать это:

Foo() : str({'s','t','r'}) {}       //C++11 only

Или, вы можете предпочесть этот intead:

class Foo
{
public:
   Foo() {}
   char str[4] = "str"; //in-class initialization (C++11 only)
};

Кроме того, вы можете рассмотреть возможность использования std::string или же std::vector<char> независимо от версии C++, которую вы используете.

Другие вопросы по тегам