显式运算符<<选择重载'wrong'
Explicit operator<< selects 'wrong' overload
我在玩可变模板,并写了这个,基于这个答案:
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
类的成员。char
和const char*
的重载不是std::ostream
的成员,而是自由函数,因此,在
*dummy[0] << 'n';
参数相关的查找将找到operator<<(std::ostream&, char)
,但在
dummy[0]->operator <<('n');
只考虑成员函数,导致std::ostream::operator<<(int)
被调用。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- C++ is calculating wrong
- 如何显式调用运算符<<
- Is std::is_trivially_copyable wrong?
- 使用 Boost ASIO 和 SSL 时出现"Wrong Version Number"错误 (C++)
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- 由于错误'wrong version number'无法完成握手
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 使用强制转换为"wrong"类型的指针算术
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- QMap<int,QByteArray> return Wrong QByteArray
- "Static polymorphism with Qt signal/slot: What is wrong?"
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败