std :: make_pair:无法将'ch'(类型'char')转换为'char &&'类型

mal*_*lat 6 c++ c++11

以下代码有什么问题:

#include <ctime>
#include <vector>
#include <utility>
#include <algorithm>
#include <iostream>

int main()
{
    std::vector< std::pair< char, unsigned > > vec;

    for( unsigned i = 0; i < 100; ++i )
    {
        char ch = 0;
        unsigned number = 0;

        do {
            ch = i;
            number = i;

        } while( std::find( vec.begin(), vec.end(), std::make_pair< char, unsigned >( ch, number ) ) != vec.end() );

        std::cout << ch << number << '\n';

        vec.push_back( std::make_pair< char, unsigned >( ch, number ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以很好地编译:

g++ test.cxx
Run Code Online (Sandbox Code Playgroud)

但失败了:

$ g++ -std=c++11 test.cxx                                                                                                              /tmp
test.cxx: In function 'int main()':
test.cxx:21:98: error: no matching function for call to 'make_pair(char&, unsigned int&)'
test.cxx:21:98: note: candidate is:
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.7/vector:61,
                 from test.cxx:3:
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note:   template argument deduction/substitution failed:
test.cxx:21:98: note:   cannot convert 'ch' (type 'char') to type 'char&&'
test.cxx:25:69: error: no matching function for call to 'make_pair(char&, unsigned int&)'
test.cxx:25:69: note: candidate is:
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.7/vector:61,
                 from test.cxx:3:
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note:   template argument deduction/substitution failed:
test.cxx:25:69: note:   cannot convert 'ch' (type 'char') to type 'char&&'
Run Code Online (Sandbox Code Playgroud)

And*_*owl 14

解:

而不是以make_pair<>()这种方式显式指定模板参数:

std::make_pair< char, unsigned >( ch, number )
Run Code Online (Sandbox Code Playgroud)

只是让他们推断:

std::make_pair( ch, number )
Run Code Online (Sandbox Code Playgroud)

说明:

本指南背后的基本原理std::make_pair<>()可以通过定义的方式找到,模板参数推导的方式适用于通用引用.从C++ 11标准的第20.3.3/8-9段开始:

template <class T1, class T2> pair<V1, V2> make_pair(T1&& x, T2&& y);

返回:pair<V1, V2>(std::forward<T1>(x), std::forward<T2>(y)); 其中V1和V2确定如下:设Uidecay<Ti>::type每个Ti.然后,每个ViX&,如果Ui等号reference_wrapper<X>,否则ViUi.[ 例子:代替:

return pair<int, double>(5, 3.1415926); // explicit types

C++程序可能包含:

return make_pair(5, 3.1415926); // types are deduced

- 结束例子 ]

在这里,T1并且T2意味着被推导出来.通过自己明确指定模板参数,您可以使用make_pair<>()类型推导机制来生成正确的返回类型,从而强制实例化一个接受rvalue引用的函数,char并且rvalue引用unsigned:

... make_pair(char&&, unsigned&&)
Run Code Online (Sandbox Code Playgroud)

但是,你是不是在提供输入右值,因为chnumber是左值.这就是编译器所抱怨的.


替代方案:

另请注意,您可以隐式构造一个std::pair对象,从make_pair<>()根本上保存您的调用:

vec.push_back( { ch, number } );
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2214 次

最近记录:

6 年,11 月 前