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)
这样的错误至少引发了两个问题:
- 这两个语句有何不同(在名称查找方面)?
- 为什么
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/