显式运算符<<选择重载'wrong'

Explicit operator<< selects 'wrong' overload

本文关键字:lt wrong 重载 选择 运算符      更新时间:2023-10-16

我在玩可变模板,并写了这个,基于这个答案:

template <size_t... I>
void print(seq<I...>)
{
    decltype(std::cout) * dummy[sizeof...(I)] = { &(std::cout << I << ' ')... };
}

因为std::cout::operator<<有一个返回类型,所以它可以被存储,所以不需要( ,0)逗号技巧。

现在,为了关闭"未使用的变量'dummy'"警告,并打印换行符,我尝试了以下语句,但它们没有达到我想要的效果:

dummy[0]->operator <<('n'); // prints 10

(显然是operator<<(int)而不是operator<<(char)

)
dummy[0]->operator <<("n"); // prints a pointer

(显然是operator<<(const void*)而不是operator<<(const char*)

)

最后,我不得不写

*dummy[0] << 'n';             // prints a newline as desired

我的问题是,为什么选择了"错误的"重载?

选择"错误的"重载是因为只有一些重载是std::ostream类的成员。charconst char*的重载不是std::ostream的成员,而是自由函数,因此,在

*dummy[0] << 'n';

参数相关的查找将找到operator<<(std::ostream&, char),但在

dummy[0]->operator <<('n');

只考虑成员函数,导致std::ostream::operator<<(int)被调用。