how std::thread constructor detects rvalue reference?

后端 未结 3 1503
栀梦
栀梦 2021-01-14 11:16

Obviously it is possible to pass an rvalue reference to std::thread constructor. My problem is with definition of this constructor in cppreference. It says that

相关标签:
3条回答
  • 2021-01-14 11:52
    auto s = std::decay_copy(std::string("hello"));
    

    Is equivalent to:

    template<>
    std::string std::decay_copy<std::string>(std::string&& src) {
        return std::string(std::move(src));
    }
    
    std::string s = decay_copy<std::string>(std::string("hello"));
    
    0 讨论(0)
  • 2021-01-14 11:57

    It is common problem of the perfect forwarding. If you want to restore information about rvalue in the function, you have to use std::forward std::forward . If you are interested in the value type detection you may read this value_category . From the description you can find the information how the compiler recognizes rvalue, xvalue, lvalue, prvalue, gvalue on compile time.

    0 讨论(0)
  • 2021-01-14 12:08

    The std::thread constructor knows the value category of its arguments, because it knows what Function and Args... are, which it uses to perfectly forward the its parameters to decay_copy (or equivalent).

    The actual thread function doesn't know the value category. It's always invoked as an rvalue, with all rvalue arguments - which makes sense: the copies of f and args... are local to the thread, and won't be used anywhere else.

    0 讨论(0)
提交回复
热议问题