Правила приоритета и лямбда-выражения - PullRequest
2 голосов
/ 08 августа 2011

Я пытаюсь понять разницу в предупреждении, которое дает gcc-4.3.2 и GCC-4.5.1.

Учитывая

struct S { };

int main() {
  int** i;
  i = new  int*[10] ; delete[] i; // [1a]
  i = new (int*[10]); delete[] i; // [1b]

  S** s;
  s = new  S*[10];   // [2a] fine
  s = new (S*[10]); // [2b] warning: lambda expressions only available with -std=c++0x or -std=gnu++0x
}

Я понимаю, что [1a] и [2a] правильно инициализируют динамический массив указатели с неинициализированными указателями.

У нас есть экземпляры [2b] в нашей кодовой базе, где кто-то действительно хотел [2a]. С лучшей поддержкой C ++ 0x в gcc-4.5.1 [2b] внезапно запускается предупреждение.

У меня вопрос: что бы на самом деле сделал * 1015 в C ++ 0x? И что это разница с [1b], которая выглядит нормально в gcc-4.5.1? [2b] делал правильно с gcc-4.3.2 и C ++ 03?

PS. Я знаю о контейнерах STL.

1 Ответ

2 голосов
/ 08 августа 2011

Предупреждение является ошибкой: выражение не может быть ошибочно принято как лямбда-выражение; Это сделало бы то же самое с определенным параметром --std = c ++ 0x.

Смотри также

Я тестировал с gcc v 4.3,4.4,4.5 и 4.6. Только 4.5 выдает мошенническое предупреждение, 4.6 с радостью компилирует код без жалоб.

Редактировать: Точные версии проверены

  • gcc версия 4.3.5 (Ubuntu 4.3.5-3ubuntu1)
  • gcc версия 4.4.5 (Ubuntu / Linaro 4.4.4-14ubuntu5)
  • gcc версии 4.5.1 (Ubuntu / Linaro 4.5.1-7ubuntu2) предупреждает
  • gcc версия 4.6.1 20110604 (предварительная версия) (Debian 4.6.0-11)

Обновление Я только что доказал, что скомпилированный вывод компилятора 4.5.1 (и всех остальных версий, в этом отношении) точно идентичен, независимо от того, указали ли вы --std=c++0x в командной строке делая

g++ -o 5-0x.s --std=c++0x -S test.cpp
g++ -o 5.s    -S             test.cpp

Сравнение 5-0x.s и 5.s не показывает никакой разницы.

...