LINUX.ORG.RU

Почему не работает предупреждение для std::auto_ptr?

 ,


0

1

В C++11 auto_ptr объявлен как deprecated, но предупреждения при его использовании почему-то нет.

В файле /usr/include/c++/4.7/backward/auto_ptr.h класс auto_ptr помечен как __attribute__ ((__deprecated__)). Проверил, что включается именно этот файл и макросы __GXX_EXPERIMENTAL_CXX0X__, __DEPRECATED, _GLIBCXX_DEPRECATED в нем определены правильно.

Вот код, который собирается без предупреждений:

#include <memory>

int main()
{
        std::auto_ptr<int> a(new int);
        return 0;
}

Пробовал собирать так:

g++-4.7 -std=gnu++11 -Wall -Wextra -Wdeprecated-declarations -Wsystem-headers -pedantic auto_ptr.cpp

Вот вывод «g++-4.7 -std=gnu++11 auto_ptr.cpp -E -P»: http://pastebin.com/fBRW51Wj



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

Ну, объявлен. Ну, deprecated.

Но технически, класс auto_ptr в libstdc++ не помечен как deprecated.

И на выхлопе препроцессора это видно.

В чём проблема?

Не путай deprecated в сознании людей с deprecated в исходниках.

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

... в исходниках

одной из реализаций c++

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

Упс, выложил неправильный выхлоп препроцессора (без -std=gnu++11).
А проблема как раз техническая: в исходниках auto_ptr помечен макросом _GLIBCXX_DEPRECATED и разворачивается он правильно.

Правильная ссылка: http://pastebin.com/fBRW51Wj

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

В примере из Википедии [1] есть предупреждения:

# g++-4.7 -std=gnu++11 -Wall -Wextra -Wdeprecated-declarations  -pedantic test.cpp 
test.cpp: In function ‘int main(int, char**)’:
test.cpp:9:19: warning: ‘auto_ptr’ is deprecated (declared at /usr/include/c++/4.7/backward/auto_ptr.h:87) [-Wdeprecated-declarations]
test.cpp: At global scope:
test.cpp:5:5: warning: unused parameter ‘argc’ [-Wunused-parameter]
test.cpp:5:5: warning: unused parameter ‘argv’ [-Wunused-parameter]

[1] http://en.wikipedia.org/wiki/Auto_ptr

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

Ух ты, спасибо.

Вот так предупреждение есть:

#include <memory>

int main()
{
    std::auto_ptr<int> x(new int);
    std::auto_ptr<int> y;
 
    return 0;
}

А вот так нет:

#include <memory>

int main()
{
    std::auto_ptr<int> x(new int);
 
    return 0;
}

Можете у себя проверить? У меня gcc 4.7.2. Это ведь баг, а не фича? :)

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

Ого, оперативно. Спасибо.

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