分配操作员是否“需要”返回?

时间:2011-11-14 07:41:36

标签: c++ standards

根据C ++标准,我能确定内置变量的赋值运算符返回(原始值)吗?

或者这个实现是否依赖(但只是让大多数流行的编译器实现了这个)?

5 个答案:

答案 0 :(得分:10)

是的,保证:

  

5.17分配和复合赋值运算符

     

赋值运算符(=)和复合赋值运算符all group   右到左。所有都需要一个可修改的左值作为左操作数   并且返回一个引用左操作数的左值。

这适用于内置类型。使用用户定义的类型,它可以返回任何内容。

答案 1 :(得分:5)

这取决于“原始值”的含义。

例如:

#include <iostream>
int main() {
    int i;
    std::cout << (i = 1.9) << "\n";
}

打印1。赋值表达式产生LHS的新值(即1),而不是RHS的“原始值”(1.9)。

我不确定这是不是你要问的问题。

答案 2 :(得分:3)

  

根据C ++标准,我可以确定构建变量的赋值运算符返回(原始值)吗?

编辑我想,我现在就知道了。是的:您可以确保内置类型在operator=, *=, /=, -=, +=, ^=, ~=, &= and |=之后通过引用返回原始值

“对于构建变量”对我来说有点神秘。然而,

<击>
X makeX()
{
    return X();
} // must have accessible copy constructor

// ...
X x;
x = makeX(); // ... _and_ assignment operator

<击>

  

或者这个实现是否依赖

它应该 编辑参见UncleBens的标准参考

答案 3 :(得分:0)

是。保证预定义类型的所有分配和增强分配都以这种方式工作。

但请注意,用户定义的类型分配或扩充分配可以改为返回void。这不是一个好的做法,不应该这样做(它会给用户带来惊喜效果 - 这不是一件好事),但它在技术上是可行的,所以如果你正在编写一个模板库,你不应该做出这个假设,除非它真的很重要对你而言。

答案 4 :(得分:-2)

是。操作符语义将无法正常工作。