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

时间:2015-10-19 09:13:57

标签: c++ c++11 variadic-templates

我正在使用可变参数模板,并根据this answer写了这个:

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

由于std::cout::operator<<具有返回类型,因此可以存储它,因此不需要( ,0)逗号技巧。

现在,关闭&#34;未使用的变量&#39; dummy&#39;&#34;警告,并打印换行符,我尝试了以下声明,但他们没有做我想做的事情:

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

我的问题是,为什么&#34;错误&#34;超载被选中了吗?

1 个答案:

答案 0 :(得分:9)

选择“错误”重载是因为only some overloadsstd::ostream类的成员。 charconst char*的重载不是std::ostream的成员,而是free functions的成员,因此,

*dummy[0] << '\n';

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

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

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