C++11 make_pair с указанными параметрами шаблона не компилируется

Я просто играл с g++ 4.7 (один из более поздних снимков) с включенным параметром -std=c++11. Я попытался скомпилировать часть моего существующего кода, и один неудачный случай несколько меня смущает.

Буду признателен, если кто-нибудь объяснит, что происходит.

Вот код:

#include <utility>
#include <iostream>
#include <vector>
#include <string>

int main ( )
{
    std::string s = "abc";

    // 1 ok
    std::pair < std::string, int > a = std::make_pair ( s, 7 );

    // 2 error on the next line
    std::pair < std::string, int > b = std::make_pair < std::string, int > ( s, 7 );

    // 3 ok
    std::pair < std::string, int > d = std::pair < std::string, int > ( s, 7 );

    return 0;
}

Я понимаю, что make_pair предназначендля использования в качестве (1) случая (если я укажу типы, то я мог бы также использовать (3)), но Не понимаю, почему в данном случае не работает.

Точная ошибка:

test.cpp: In function ‘int main()’:
    test.cpp:11:83: error: no matching function for call to ‘make_pair(std::string&, int)’
    test.cpp:11:83: note: candidate is:
    In file included from /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/utility:72:0,
                 from test.cpp:1:
    /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5:
note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_T1>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
    /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5:
note:   template argument deduction/substitution failed:
    test.cpp:11:83: note:   cannot convert ‘s’ (type ‘std::string {aka std::basic_string<char>}’) to type ‘std::basic_string<char>&&’

Опять же, здесь вопрос просто "что происходит?" Я знаю, что могу решить проблему, удалив спецификацию шаблона, но я просто хочу знать, что здесь не так.

  • g++ 4.4 компилирует этот код без проблем.
  • Удаление -std=c++11 также без проблем компилирует код.
78
задан 1201ProgramAlarm 26 June 2019 в 19:12
поделиться