显式运算符<<选择'错误'重载

Bul*_*net 4 c++ variadic-templates c++11

我正在使用可变参数模板,并基于这个答案写了这个:

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

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

现在,为了关闭"未使用的变量'虚拟''警告,并打印换行符,我尝试了以下语句,但它们没有按照我的意愿行事:

dummy[0]->operator <<('\n'); // prints 10
Run Code Online (Sandbox Code Playgroud)

(显然叫做operator<<(int)代替operator<<(char)

dummy[0]->operator <<("\n"); // prints a pointer
Run Code Online (Sandbox Code Playgroud)

(显然叫做operator<<(const void*)代替operator<<(const char*)

最后,我不得不写

*dummy[0] << '\n';             // prints a newline as desired
Run Code Online (Sandbox Code Playgroud)

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

For*_*veR 9

选择"错误"重载是因为只有一些重载std::ostream类的成员.过载charconst char*不是成员std::ostream,但是免费功能,所以,在

*dummy[0] << '\n';
Run Code Online (Sandbox Code Playgroud)

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

dummy[0]->operator <<('\n');
Run Code Online (Sandbox Code Playgroud)

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