Krz*_*icz 22 c++ syntax iostream operator-overloading
C++中的运算符通常被认为是函数/方法的替代语法,尤其是在重载的上下文中.如果是这样,下面的两个表达式应该是同义词:
std::cout << 42;
operator<<(std::cout, 42);
Run Code Online (Sandbox Code Playgroud)
实际上,第二个语句会导致以下错误:
call of overloaded ‘operator<<(std::ostream&, int)’ is ambiguous
Run Code Online (Sandbox Code Playgroud)
像往常一样,这样的错误信息附有可能的候选人名单,这些是:
operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
operator<<(basic_ostream<char, _Traits>& __out, char __c)
operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
Run Code Online (Sandbox Code Playgroud)
这种错误至少引发了两个问题:
operator<<(basic_ostream<char, _Traits>& __out,int__c)看起来,中缀和前缀符号不是完全可互换的 - 不同的语法需要不同的名称解析策略.有什么区别,它们来自哪里?
Igo*_*nik 16
不,这两个表达式不应该是同义词.std::cout << 42被查找既operator<<(std::cout, 42)和std::cout.operator<<(42).两个查找产生可行的候选者,但第二个是更好的匹配.
| 归档时间: |
|
| 查看次数: |
640 次 |
| 最近记录: |