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

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

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

И это?

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

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

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

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

5

Решение

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

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

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

5

Другие решения

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

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

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

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

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

4

В 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 ++, которую вы используете.

2
По вопросам рекламы [email protected]