C++ std::make_对类型推断
我遇到了一些奇怪的事情,我想解释一下。下面的代码片段提供了一个简单的类模板C++ std::make_对类型推断,c++,templates,c++11,stl,C++,Templates,C++11,Stl,我遇到了一些奇怪的事情,我想解释一下。下面的代码片段提供了一个简单的类模板type和两个操作符 第一个失败是因为std::make_pair似乎从变量中删除了常量说明符,而常量说明符又与第二个运算符ep的签名不匹配。图书馆试图阻止你陷入一片混乱;使配对const,而不是它的元素。std::pair有两个成员,其const属性取决于模板参数,而不是std::pair本身的运行时const属性。ReqnRPSJ认为,即使 int 是可变的,也不能修改 int const和。@ BARRY MMH,
type
和两个操作符
第一个失败是因为std::make_pair
似乎从变量中删除了常量说明符,而常量说明符又与第二个运算符ep的签名不匹配。图书馆试图阻止你陷入一片混乱;使配对const
,而不是它的元素。std::pair
有两个成员,其const
属性取决于模板参数,而不是std::pair
本身的运行时const
属性。ReqnRPSJ认为,即使<代码> int <代码>是可变的,也不能修改<代码> int const和<代码>。@ BARRY MMH,<代码> int const和实际上说<代码>引用常量INT/COM>,这显然禁止变异<代码> int >代码>。otoh,int*const
是指向int
的常量指针,因此int
是可变的,只是指向它的指针不能更改。但是,我同意你的观点,可能需要提交一份缺陷报告,其中包括语言律师;)@regnirpsj,嗯?什么样的缺陷报告?我认为STD::配对和STD::MaMuxAB对没有好处(特别是用STD::MAP,其中STD::MaMuxGub(key,value)不提供MAP::ValueSyType)。@ MARCO-A感谢编辑编译器消息。医生不太清楚怎么做。您是否使用了
标记?@regnirpsj不,当有一个项目符号列表时,需要两倍的代码空间。应该在某处说明。
std_make_pair.cpp: In function 'int main()':
std_make_pair.cpp:52:35: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
std::cout << std::make_pair(a, b) << std::endl;
^
In file included from std_make_pair.cpp:3:0:
/usr/include/c++/4.9.2/ostream:602:5: note: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::pair<type<float>, type<float> >]'
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
^
std_make_pair.cpp:52:13: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>')
and 'pair<typename __decay_and_strip<const type<float> &>::__type, typename __decay_and_strip<const
type<float> &>::__type>')
std::cout << std::make_pair(a, b) << std::endl;
~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~
std_make_pair.cpp:30:1: note: candidate template ignored: can't deduce a type for 'T' which would make
'const T' equal 'type<float>'
operator<<(std::basic_ostream<CTy,CTr>& os, std::pair<T const, T const> const& a)
template <class T1, class T2>
constexpr pair<V1, V2> make_pair(T1&& x, T2&& y);
template <typename CTy, typename CTr, typename T>
std::basic_ostream<CTy,CTr>&
operator<<(std::basic_ostream<CTy,CTr>& os, std::pair<T, T> const& a)
{
return os << a.first << ',' << a.second;
}