Это нормально использовать инициализацию, как это?
class Foo
{
public:
Foo() : str("str") {}
char str[4];
};
И это?
int main()
{
char str[4]("str");
}
Оба дают мне ошибку в GCC 4.7.2:
ошибка: массив используется как инициализатор
Comeau компилирует оба.
Этот код является допустимым C ++ 03 и gcc здесь просто не соответствует.
Язык, который допускает этот синтаксис для инициализации символьных массивов, такой же, как и для любого другого типа; нет исключений, которые запрещали бы его использование в массивах символов. ()
а также =
инициализация в этих случаях эквивалентна, и массив символов следует просто инициализировать в соответствии с 8.5.2.
Вот подтвержденный отчет об ошибке gcc, который покрывает это.
В C ++ 03 массив нестатических элементов не может быть инициализирован, как вы упомянули. В g ++ может быть расширение список инициализаторов, но это особенность C ++ 11.
Локальная переменная в функции может быть инициализирована следующим образом:
char str[] = "str"; // (1)
char str[] = {'s','t','r',0}; // (2)
Хотя вы можете упомянуть размер как 4
, но это лучше не упомянуто чтобы избежать случайного массива за пределами.
Я бы порекомендовал использовать std::string
в обоих случаях.
В 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 ++, которую вы используете.