Эта проблема не имеет ничего общего с константой карты: это предупреждение, потому что возвращаемый тип константной версии std::map::at()
равен const mapped_type&
. Этот код также выдает предупреждение:
typedef void *DuplicateFn();
typedef std::map< int, DuplicateFn > DuplicateMapTy;
DuplicateMapTy DuplicateFns;
Тип карты повторного запуска at
здесь
const DuplicateFn&
Хотя это предупреждение имеет место (хотя я не слишком уверен, что в данной конкретной ситуации оно оправдано стандартом), в этом случае не должно быть никакого вреда, чтобы отключить его локально для кода, использующего карту, или если вам не нравится прагма хлопот, оберните ваш указатель функции в простую структуру.
edit , как указывает Горпик в комментарии ниже, на самом деле это генерируется в этом конкретном месте, хотя функция не используется. Кажется, что компилятор VS довольно агрессивен при поиске предупреждений: он учитывает объявления.
template< class T >
struct CheckMe
{
const T& at() //warning C4180 pops up
{
//gets not instantiated hence no error for missing returntype
}
};
CheckMe< DuplicateFn > check;