assignment-operator相关内容
在尝试实现虚拟赋值运算符时,我以一个有趣的行为结束.这不是编译器故障,因为 g++ 4.1、4.3 和 VS 2005 具有相同的行为. 基本上,就实际执行的代码而言,virtual operator= 的行为与任何其他虚函数不同. struct Base {虚拟基地&f( 基本常量 & ) {std::cout
..
Python 3.2.3(默认,2012 年 4 月 11 日,07:15:24)[MSC v.1500 32 位(英特尔)] on win32输入“帮助"、“版权"、“信用"或“许可证"以获取更多信息.>>>你 = [4, 5, 6, 7, 8, 9]>>>u[1::1] = [3, 2, 1, 0]>>>你[4, 3, 2, 1, 0]>>>u[9:0:-1] = [8, 7, 6, 5]>>
..
考虑以下代码: struct s{const int id;s(int _id):id(_id){}};//...向量v;v.push_back(s(1)); 我收到一个编译器错误,提示“const int id"不能使用默认赋值运算符. Q1.为什么 push_back() 需要赋值运算符? A1.因为当前的 C++ 标准是这样说的. Q2.我该怎么办? 我不想放弃 co
..
我知道以下一些语言: a += b 比: 更有效率 a = a + b 因为它不需要创建临时变量.在 C 中是这种情况吗?使用 += 是否更有效(因此还有 -= *= 等) 解决方案 这里有一个明确的答案... $ catjunk1.c#include int main(){长 a, s = 0;对于 (a = 0; a int main(){长 a, s = 0;对于 (a
..
基类中的赋值运算符在派生类中似乎不可用.鉴于此代码: #include A类{整数值;民众:A&运算符=(整数值){这->值=值;返回 *this;}};B 类:公共 A{};int main(){乙乙;乙 = 0;//不起作用返回0;} GCC 6.4 说: 错误:'operator=' 不匹配(操作数类型为 'B' 和 'int') 发生了什么? 解决方案 当我们自己不
..
代码如下: #include 使用命名空间标准;A类{};A rtByValue() {返回 A();}void passByRef(A &aRef) {//没做什么}int main() {一个啊;rtByValue() = aa;//编译没有错误passByRef(rtByValue());//编译出错返回0;} g++ 编译器给出以下错误: d.cpp:在函数‘int main()’
..
我正在研究数据结构(列表、堆栈、队列),这部分代码让我很困惑. ListNode(const Object& theElement = Object(), ListNode * node = NULL);模板ListNode::ListNode(const Object&theElement, ListNode * node) {元素 = 元素;下一个 = 节点;} 为什么函数参数中有赋值运算
..
我是 C++ 世界(还有 C)的新手.并且不知道它的所有细节.但有一件事真的让我很困扰.它是这样的结构:while (a=b) {...} .据我所知,这个魔法是有效的,因为 C 和 C++ 中的赋值运算符会返回一些东西.那么问题来了:它返回什么?这是记录在案的事情吗?它在 C 和 C++ 中的工作方式是否相同.非常感谢有关赋值运算符及其在 C 和 C++ 中的实现(如果有差异)的低级详细信息!
..
在 Herb Sutter 的书 Exceptional C++ (1999) 中,他在第 10 项的解决方案中有文字: “异常不安全"和“糟糕的设计"齐头并进.如果一段代码不是异常安全的,那通常没问题,可以简单地修复.但是,如果一段代码由于其底层设计而不能成为异常安全的,那几乎总是一个糟糕设计的信号. 示例 1:具有两种不同职责的函数很难使异常安全. 示例 2:以必须检查自赋值
..
如何在不使用 operator=() 的情况下将 push_back() 推到 C++ std::vector 中,默认定义违反了 const 成员? struct Item {项目(整数值):_值(值){}常量字符_值;}矢量项目;items.push_back(Item(3)); 我想保留 _value 常量,因为它在构造对象后不应该改变,所以问题是如何在不调用 operator=() 的
..
我可以分配一个指向整型变量的指针吗?像下面这样. int *pointer;int array1[25];int addressOfArray;指针 = &array1[0];addressOfArray = 指针; 可以这样做吗? 解决方案 并非没有明确的强制转换,即 addressOfArray = (int) 指针; 还有一个警告: 6.3.2.3 指针 ... 6 任
..
std::ops,但没有什么可用于简单的赋值. 我来自 C++ 背景,那里有复制构造函数和赋值运算符重载为您完成工作.我在 Rust 中需要类似的东西. 解决方案 你不能重载赋值.将变量从一个位置移动到另一个位置是 Rust 所有权语义的核心组成部分,并且是不可覆盖的. 另一个答案建议您自定义实现 Copy 特性.这是没有意义的,因为没有什么可实现的: pub trait C
..
如果T是一个带有默认赋值运算符签名的类类型,那么我们可以这样写: T const &ref = ( T{} = something ); 创建一个悬空引用.但是,带有签名: T &operator=(T t) & 上面带有悬空引用的代码将无法编译.这将防止我们返回指定临时对象的左值的某些情况——不希望出现的情况,因为它们可能导致悬空引用. 有什么理由不这样做吗?我们会禁用赋值运算符的
..
对于所有逻辑运算符、移位运算符、加法运算符和所有乘法运算符,我们都有等效的赋值运算符. 为什么逻辑运算符被遗漏了?有什么好的技术原因为什么很难吗? 解决方案 为什么逻辑运算符被遗漏了?有什么好的技术原因为什么很难吗? 他们没有.如果需要,您可以执行 &= 或 |= 或 ^= . bool b1 = false;布尔 b2 = 真;b1 |= b2;//表示 b1 = b1
..
我有一个简单的结构 Wrapper,以两个模板化的赋值运算符重载来区分: template结构包装{包装器(){}模板Wrapper &operator=(const Wrapper &rhs) {cout &rhs) {cout
..
以下代码在 gcc 4.8.1 上编译没有问题: #include 结构体{};int main(){富吧;foo() = 酒吧;foo() = std::move( bar );} 似乎为 foo 隐式生成的赋值运算符不是 & ref-qualified,因此可以在右值上调用.根据标准,这是正确的吗?如果是这样,有什么理由不要求隐式生成的赋值运算符是 & ref-qualified?
..
我回答了关于 我是否有未定义的行为 (UB)? 没有 UB 的解决方案是什么? 解决方案 您的代码导致未定义的行为. 不仅仅是“未定义,如果 A 用作基类,并且这个、那个或另一个".实际上未定义,总是.return *this 已经是 UB,因为 this 不能保证引用新对象. 具体来说,请考虑 3.8/7: 如果,在一个对象的生命周期之后已经结束并且在存储之
..
如果我说let 5 = 10,为什么5 + 1返回6而不是11? 解决方案 当你说 让 5 = 10 这不是对5的重新定义,而是模式匹配,和你说的时候一样 foo 5 = 未定义... foo 10 ... 如果匹配过,模式就会失败. 在 let 表达式中,匹配是惰性的.这意味着匹配仅在对其绑定的变量进行评估时进行.这允许我们编写类似 let foo = undefine
..
这里摘录自“C++ Gotchas"一书第 56 条: 经常看到一个简单的写入的 Y 对象的初始化三种不同方式中的任何一种,好像它们是等价的. Y a( 1066 );Y b = Y(1066);Yc = 1066; 事实上,所有这三个初始化可能会导致在相同的目标代码中生成,但它们不等价.a 的初始化称为直接初始化,它确实正是人们所期望的.这初始化是通过直接调用 Y::Y(int).
..
我正在阅读一本关于 C++ 的书,更准确地说是关于运算符重载的书. 示例如下: const Array &Array::operator=(const Array &right){//检查自赋值//如果不是自赋值,则进行复制返回 *this;//启用x=y=z} 书中关于返回const ref而不是ref的解释是为了避免诸如(x=y)=z之类的赋值.我不明白为什么我们应该避免这种情况.我
..