LINUX.ORG.RU

c++11 - лямбды, скоп и стандарт

 , ,


0

3

Дано:

#include <iostream>
int main()
{
  int a = 42;
  auto f = []() {
    char a = 'd';
    return a;
  };
  std::cout << "f: " << f() << "\n";
  return 0;
}

компилируем...

$ g++ --std=c++11 -Wshadow 1.cpp           
1.cpp: In lambda function:                                                 
1.cpp:6:10: warning: declaration of ‘a’ shadows a previous local [-Wshadow]
     char a = 'd';                                                         
          ^                                                                
1.cpp:4:7: note: shadowed declaration is here                              
   int a = 42;                                                             
       ^                                                                   
Почему так?

★★★★★

Последнее исправление: invy (всего исправлений: 2)

return a;
}

Точку с запятой забыл. Так у меня вообще не компилируется. После добавления — только варнинг про неиспользуемую «a» в main.

gcc 6.1.1

Deleted
()
Ответ на: комментарий от Deleted

Ну да, я потом подправил в редакторе, а на лоре - нет :)

invy ★★★★★
() автор топика
Ответ на: комментарий от invy

кмк, бага. В любом случае, зарепортить будет не лишним.

Deleted
()
Ответ на: комментарий от Deleted

Гы. с -Wall ты такого варнинга не получишь. С -Wshadow — есть.

У clang на такой случай есть -Weverything, чтоб не ломать совместимость с -Wall gcc.

anonymous
()
Ответ на: комментарий от anonymous

Хм, спасибо, не знал.

Однако и он — не панацея:

t.cpp:5:3: warning: 'auto' type specifier is incompatible with C++98 [-Wc++98-compat]
  auto f = []() {
  ^~~~
t.cpp:5:12: warning: lambda expressions are incompatible with C++98 [-Wc++98-compat]
  auto f = []() {
           ^
t.cpp:6:10: warning: declaration shadows a local variable [-Wshadow]
    char a = 'd';
         ^
t.cpp:4:7: note: previous declaration is here
  int a = 42;
      ^
t.cpp:4:7: warning: unused variable 'a' [-Wunused-variable]
  int a = 42;
      ^
4 warnings generated.

Deleted
()
Ответ на: комментарий от anonymous

Упс, сорри, я умудрился не заметить таки сгенеренный -Wshadow.

Пора бы уже домой =_=

Deleted
()

Почему так?

А что не так? У тебя действительно есть локальная переменная a, и её «затеняет» локальная a в лябмде. Программист вполне мог забыть захватить a, объявив при этом локальную a, и не заметить ошибки. Я думаю, такое предупреждение — хорошая штука.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Логично, если такое предупреждение будет выдаваться, если переменная захвачена. А если не захвачена - undeclared.

invy ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Это сообщение еще хуже, когда это происходит на работе и там стоит -Werror -Wshadow.

invy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.