提问人:Jonathan 提问时间:9/13/2022 最后编辑:Jonathan 更新时间:9/14/2022 访问量:125
如果 std::reference_wrapper 没有 operator+=> std::reference_wrapper<int 如何使用 operator+=?
How can std::reference_wrapper<int> use operator+= if std::reference_wrapper doesn't have operator+=?
问:
谢谢大家,我什至不知道用户定义的转换函数及其工作原理。
为什么可以使用,如果这样的运算符不存在,是否存在一些隐式转换?std::reference_wrapper<int>::operator+=
#include <iostream>
#include <functional>
#include <boost/type_index.hpp>
using boost::typeindex::type_id_with_cvr;
template <typename C>
void test(C c)
{
c += 1;
}
int main()
{
int a = 3;
test(a);
std::cout << a << std::endl;
test(std::ref(a));
std::cout << a << std::endl;
}
输出:
3
4
要检查模板是否正常工作,请执行以下操作:
void test_2(std::reference_wrapper<int> c)
{
c += 1;
}
int main()
{
int a = 3;
test_2(std::ref(a));
std::cout << a << std::endl;
}
输出:
4
仍然像以前一样工作。这怎么可能?
有趣的是,在 中有一个整数类型。auto d = b + c
d
int main()
{
auto b = std::ref(a);
auto c = std::ref(a);
auto d = b + c;
std::cout << type_id_with_cvr<decltype(d)>).pretty_name() << std::endl;
}
输出:
int
答:
5赞
Ted Lyngmo
9/13/2022
#1
这是因为它隐式地可转换为对以下内容的引用:T
/* constexpr [c++20] */ operator T& () const noexcept;
在您的例子中,它可以隐式转换为 .int&
这种隐式可转换为 an 的能力也使您可以定义函数,同时向它传递 a :int&
int&
std::reference_wrapper<int>
void test_2(int& c) // <--+
{ // |
c += 1; // |
} // |
int main() { // |
// ... // |
test_2(std::ref(a)); // >--+
}
评论
std::reference_wrapper
std::reference_wrapper::operator+=()
operator T& ()
[Solved]
不属于问题,请删除。表明问题已解决的正确方法是投票并接受引导您找到解决方案的答案,或者发布您自己的答案。