如果 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+=?

提问人:Jonathan 提问时间:9/13/2022 最后编辑:Jonathan 更新时间:9/14/2022 访问量:125

问:

谢谢大家,我什至不知道用户定义的转换函数及其工作原理。


为什么可以使用,如果这样的运算符不存在,是否存在一些隐式转换?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 + cd

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
C++ C++11 标准

评论

1赞 Ben Voigt 9/13/2022
“有一些隐含的皈依吗?”隐式转换几乎是存在的全部原因。因此,您没有调用std::reference_wrapperstd::reference_wrapper::operator+=()
0赞 NathanOliver 9/13/2022
它是一个引用包装器,它就像一个引用......
0赞 273K 9/13/2022
它有.operator T& ()
0赞 Remy Lebeau 9/14/2022
[Solved]不属于问题,请删除。表明问题已解决的正确方法是投票并接受引导您找到解决方案的答案,或者发布您自己的答案

答:

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));  // >--+
}