我正在玩弄可变参数模板,并根据 this answer 写了这篇文章:
template <size_t... I>
void print(seq<I...>)
{
decltype(std::cout) * dummy[sizeof...(I)] = { &(std::cout << I << ' ')... };
}
因为 std::cout::operator<<
有一个返回类型,它可以被存储,所以不需要 ( ,0)
逗号技巧。
现在,为了关闭“unused variable '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
我的问题是,为什么选择了“错误的”重载?
最佳答案
选择“错误的”重载是因为 only some overloads是 std::ostream
的成员类(class)。 char
的重载和 const char*
不是 std::ostream
的成员, 但是 free functions ,所以,在
*dummy[0] << '\n';
依赖于参数的查找将找到 operator<<(std::ostream&, char)
, 但在
dummy[0]->operator <<('\n');
仅考虑成员函数,结果为 std::ostream::operator<<(int)
被调用。
关于c++ - 显式运算符 << 选择 'wrong' 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210688/