gpt4 book ai didi

c++ - 为什么不将自动向下转换应用于模板函数?

转载 作者:可可西里 更新时间:2023-11-01 18:29:06 26 4
gpt4 key购买 nike

有人问this question关于字符串追加。是 string s; s = s + 2; 未编译。人们给出的答案是 operator+ 被定义为模板函数而 operator+= 不是,所以自动向下转换 (int(2)char(2)) 不适用。

原型(prototype)是

template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string{
basic_string&
operator+=(_CharT __c);
};

template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs);

为什么编译器不能只使用这个原型(prototype)并将 int(2) 转换为 char(2)?

basic_string<char, _T, _A> operator+(const basic_string<char, _T, _A>, char);

编译器 (G++ 6.3.0) 提示

[Note] deduced conflicting types for parameter '_CharT' ('char' and 'int')

最佳答案

关键区别在于 operator +=变体,std::basic_string 的 char 类型模板参数,因此其 RHS 的参数类型已固定为 char , 而 operator+模板必须从其参数中推断出这一点。

因此,对于 +=情况下,编译器知道你“想要” int -> char转换,那里没有什么可以推断的。

对于 operator+另一方面,编译器正在查看模板

template<class CharT, class Traits, class Alloc>
basic_string<CharT,Traits,Alloc>
operator+( const basic_string<CharT,Traits,Alloc>& lhs,
CharT rhs );

并且,当试图确定什么时 CharT应该是,它得到CharT = char来自第一个操作数(因为 std::stringstd::basic_string<char> )和 CharT = int来自第二个操作数。这种冲突被标准定义为编译错误。

关于c++ - 为什么不将自动向下转换应用于模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45506372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com