c++ - 中缀 vs 前缀语法 : name lookup differences

标签 c++ syntax operator-overloading iostream

C++ 中的运算符通常被认为是函数/方法的替代语法,尤其是在重载的上下文中。如果是这样,下面的两个表达式应该是同义词:

std::cout << 42;
operator<<(std::cout, 42);

在实践中,第二条语句会导致以下错误:

call of overloaded ‘operator<<(std::ostream&, int)’ is ambiguous

像往常一样,这样的错误信息伴随着一个可能的候选列表,它们是:

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)

这样的错误至少引发了两个问题:

  1. 这两个语句有何不同(在名称查找方面)?
  2. 为什么 operator<<(basic_ostream<char, _Traits>& __out, int __c)不见了?

中缀和前缀符号似乎不能完全互换——不同的语法需要不同的名称解析策略。有什么区别?它们来自哪里?

最佳答案

不,这两个表达式不应该是同义词。 std::cout << 42被查找为 operator<<(std::cout, 42)std::cout.operator<<(42) .两种查找都产生了可行的候选者,但第二个是更好的匹配。

关于c++ - 中缀 vs 前缀语法 : name lookup differences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25352640/

相关文章:

php - 上传图片时 MySQL 语法错误

javascript - 我的代码有什么问题?

c++ - 不能重载 operator<< 作为成员函数

c++ - 如果发生错误则返回错误值,否则继续执行函数

java - 循环内的变量声明

perl - Perl 变量声明中的 $、@、% 之间有什么区别?

c++ - 我应该使用哪种 C++ 运算符重载变体?而且,为什么?

c++ - 无法在 C++ 中调用重载 << 运算符

c++ - 如何覆盖自定义 Firemonkey 控件的单击事件

c++ - 如何解析 TCP 数据包负载