← Back to context

Comment by HarHarVeryFunny

14 hours ago

Well, no, because CAN take isn't the same as WILL take.

Changing something to an rvalue means it'll now match a move constructor, but there is no guarantee a move constructor will be used, even if defined, because you've got classes like std::vector that are picky and are explicitly looking for a noexcept move constructor.

In that sense, std::move() is no different than other passing semantics. Just because you wrote at the call site that you want to pass a copy of your object doesn't mean that the callee will actually make a copy of it.

  • I'm not sure what you are saying.

    If we have foo(std::string a, std string b), and then call it like this:

    std::string x;

    std::string y;

    foo(std::move(x), y);

    Then x will be moved into a, and y will be copied into b.

    The callee has no say in this - it's just the compiler implementing the semantics of the language.

    • Who says there's only one resolution candidate? A different overload could be defined elsewhere that the compiler prefers for that particular combination of arguments, that doesn't cause a copy. std::move() works the same way. The semantics of the operation is defined not by what's at the call site, but by the context.

      6 replies →