繁体   English   中英

std :: set :: insert()可以调用赋值运算符吗?

[英]Can std::set::insert() call the assignment operator?

我有一个带有自定义赋值运算符的类,该类故意引入了受控副作用。

如果我有这些元素的std::set ,我想知道是否可以使用insert来调用赋值运算符。

即:

class A
{
public:
    A & operator=(A const & rhs)
    {
        // custom assignment operator with deliberate side effects
        // Could this be called with use of std::set::insert()?
    }
};

std::set<A> a;

// Is it possible with this, or any use of "insert", that
// the assignment operator will ever be called?

a.insert(A());

可以使用std::set::insert调用赋值运算符吗?

在C ++ 11之前的版本中,理论上可以。 毫无疑问,C ++ 11禁止使用它,因为实际上没有实现过。 在C ++ 11中, std::set成员不必支持分配。 在C ++ 11之前的版本中,某些支持概念的实现可能具有使用赋值的代码,以检查您的类是否支持该赋值,但是该赋值应处于未评估的上下文中,因此实际上不会调用该运算符。

C ++ 11标准要求与std::set::insert一起使用的类型为“ CopyInsertable”,“ MoveInsertable”或“ EmplaceConstructible”,具体取决于您使用的插入函数(23.2.3 / 4)。

例如,这定义为:

T是从args到X的EmplaceConstructible,对于args为零或多个参数,意味着以下表达式格式正确: allocator_traits<A>::construct(m, p, args); (23.2.1 / 13)

在这三种情况下,默认行为是std::allocator ,它使用新的位置(17.6.3.5/2):

::new((void*)c)A(forward<Args>(args)...)

根据不同的insert的功能,在我们的情况下args是任一类型的表达式A ,类型的右值A或一些其他参数。 但是在所有情况下,都使用构造函数或复制构造函数,而不使用赋值运算符。

这就是标准所说的(和GCC 4.6.3一样)。 即使没有理由使用赋值运算符,某些编译器仍然可以执行。 因此,我建议不要过分依赖它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM