Является ли это назначение на константу строкости, заинтересованную скобкой, действительно незаконно в C ++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Является ли это назначение на константу строкости, заинтересованную скобкой, действительно незаконно в C ++?

Сообщение Anonymous »

Я переношу большую кодовую базу из Linux/G ++ в MacOS/Clang. Я нажимаю эту ошибку компилятора в нескольких местах в Clang (где G ++ успешно строится и делает правильную вещь во время выполнения):

Ошибка: инициализатор-строка для массива char слишком длинная, размер массива составляет 1, но инициализатор имеет размер x (включая характер заканчивающий нуль) (включая коэффициент нуля). /> Обратите внимание, что я компилируюсь для C ++ 14.

Код: Выделить всё

#include 

struct StringLike
{
const char  *str;
size_t      len;

StringLike() : str(NULL), len(0) {}
template  StringLike(const char (&litAry)[LEN_]) noexcept :
str(litAry), len(LEN_ - 1) {}

StringLike &operator=(const StringLike &rhs)
{str = rhs.str; len = rhs.len; return *this;}
template  StringLike &operator=(const char (&strLit)[LEN_])
{str = strLit; len = LEN_ - 1; return *this;}
const char *data() const {return str;}
size_t length() const {return len;}
};

struct WTF
{
StringLike litStrs[3];
WTF()
{
litStrs[0] = {"Is "};
litStrs[1] = {"this "};
litStrs[2] = {"legal?"};
}
};
Да, я знаю, что мог бы удалить скобки из Litstrs [𝒏] , и это работает, но я бы не хотел менять слишком много строк кода без необходимости. Я вижу, что если я прокомментирую шаблон строкового шаблон, я получаю аналогичную ошибку от G ++; В рабочем случае код G ++ преобразуется, например, {"Is"} в строку временный с помощью этого конструктора, затем метод Operator = (const string & rhs) (обратите внимание, что удаление скобков из WTF Contruction приводит к тому, что я не знаю, чтобы не было на самом деле. выясните, как wtf закрепленные настройки (информированные на скобки (

Код: Выделить всё

operator=
, а не строительство), предполагается, что у Clang есть лучший послужной список, но я впал в тупик, какое правильное поведение здесь).
Я использовал Godbolt, чтобы убедиться, что все версии G ++ принимают этот код, и все версии Clang и сдают.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... legal-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»