Does the C++ standard guarantee that a failed insertion into an associative container will not modify the rvalue-reference argument?

前端 未结 3 789
栀梦
栀梦 2020-12-30 20:22
#include 
#include 
#include 

using namespace std::literals;

int main()
{
    auto coll = std::set{ \"hello\"s };
    auto          


        
3条回答
  •  庸人自扰
    2020-12-30 20:40

    Explicit and unequivocal NO. Standard doesn't have this guarantee, and this is why try_emplace exists.

    See notes:

    Unlike insert or emplace, these functions do not move from rvalue arguments if the insertion does not happen, which makes it easy to manipulate maps whose values are move-only types, such as std::map>. In addition, try_emplace treats the key and the arguments to the mapped_type separately, unlike emplace, which requires the arguments to construct a value_type (that is, a std::pair)

提交回复
热议问题