显式运算符 << 选择 'wrong' 重载
Explicit operator<< selects 'wrong' overload
我在玩可变参数模板,并根据 this answer 写了这篇文章:
template <size_t... I>
void print(seq<I...>)
{
decltype(std::cout) * dummy[sizeof...(I)] = { &(std::cout << I << ' ')... };
}
因为std::cout::operator<<
有return类型,可以存储,所以不需要( ,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
我的问题是,为什么选择 "wrong" 重载?
选择 "wrong" 重载是因为 only some overloads are members of std::ostream
class. The overloads for char
and const char*
are not members of std::ostream
, but free functions,因此,在
*dummy[0] << '\n';
依赖于参数的查找会找到 operator<<(std::ostream&, char)
,但在
dummy[0]->operator <<('\n');
仅考虑成员函数,导致 std::ostream::operator<<(int)
被调用。
我在玩可变参数模板,并根据 this answer 写了这篇文章:
template <size_t... I>
void print(seq<I...>)
{
decltype(std::cout) * dummy[sizeof...(I)] = { &(std::cout << I << ' ')... };
}
因为std::cout::operator<<
有return类型,可以存储,所以不需要( ,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
我的问题是,为什么选择 "wrong" 重载?
选择 "wrong" 重载是因为 only some overloads are members of std::ostream
class. The overloads for char
and const char*
are not members of std::ostream
, but free functions,因此,在
*dummy[0] << '\n';
依赖于参数的查找会找到 operator<<(std::ostream&, char)
,但在
dummy[0]->operator <<('\n');
仅考虑成员函数,导致 std::ostream::operator<<(int)
被调用。