我正在使用可变参数模板,并根据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;超载被选中了吗?
答案 0 :(得分:9)
选择“错误”重载是因为only some overloads是std::ostream
类的成员。 char
和const char*
的重载不是std::ostream
的成员,而是free functions的成员,因此,
*dummy[0] << '\n';
依赖于参数的查找将找到operator<<(std::ostream&, char)
,但在
dummy[0]->operator <<('\n');
只会考虑成员函数,导致std::ostream::operator<<(int)
被调用。