根据C ++标准,我能确定内置变量的赋值运算符返回(原始值)吗?
或者这个实现是否依赖(但只是让大多数流行的编译器实现了这个)?
答案 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)
是。操作符语义将无法正常工作。